1 Востаннє редагувалося kerimov_e (31.03.2021 21:50:00)

Тема: Помилка в коді

Доброго вечора, допожіть будь-ласка вирішити помилку.
Помилка у 26 строчці main.cpp C2662 int Date::getDay(void): неможливо перетворити покажчик "this" з"const NoteBook" у "Date &"    


Код date.h

class Date {
private:
    int day;
    int month;
    int year;

public:
    Date() {
        this->day = 0;
        this->month = 0;
        this->year = 0;

    }

    Date(int day, int month, int year) {
        this->day = day;
        this->month = month;
        this->year = year;
    }

    Date( const Date& date)  {
        this->day = date.day;
        this->month = date.month;
        this->year = date.year;
    }

    void  setDay(int day) {
        this->day = day;
    }

    void  setMonth(int month) {
        this->month = month;
    }

    void setYear(int year) {
        this->year = year;
    }


     int getDay() {
        return day;
    }

     int getMonth() {
        return month;
    }

     int getYear() {
        return year;
    }

    virtual void show() {
        std::cout << "Date: " << this->getDay() << ":" << this->getMonth() << ":" << this->getYear() << "\n";
        std::cout << std::endl;
    }

    virtual void input() {

        std::cout << "Enter day: ";
        std::cin >> this->day;

        std::cout << "Enter month: ";
        std::cin >> this->month;

        std::cout << "Enter year: ";
        std::cin >> this->year;
    } 
};

Код main.cpp

#include <iostream>

#pragma once

#include "Header.h"
#include "Date.h"

#define YEAR 365
#define MONTH 31

class  NoteBook : public Date {
private:
    std::string name;
    std::string phoneNumber;
public:
    NoteBook() : Date() {
        this->name = "";
        this->phoneNumber = "";
    }

      NoteBook(std::string name, std::string phoneNumber, int day, int month, int year) : Date(day, month, year) {
        this->name = name;
        this->phoneNumber = phoneNumber;
    }

      NoteBook(const NoteBook& noteBook) : Date(Date(noteBook.getDay(), noteBook.getMonth(), noteBook.getYear())) { //помилка
        this->name = noteBook.name;
        this->phoneNumber = noteBook.phoneNumber;

        //Date(Date(noteBook.getDay(), noteBook.getMonth(), noteBook.getYear()));
    
    }

    void setName(std::string name) {
        this->name = name;
    }

    void setPhoneNumber(std::string phoneNumber) {
        this->phoneNumber = phoneNumber;
    }

    std::string getName() {
        return this->name;
    }

    std::string getPhoneNumber() {
        return this->phoneNumber;
    }

    void show() {
        std::cout << std::endl;
        std::cout << "Name: " << this->getName() << std::endl;
        std::cout << "Phone number: " << this->getPhoneNumber() << std::endl;

        Date::show();
    }

    void input() {
        std::cout << "Enter name: ";
        std::cin >> name;

        std::cout << "Enter phone number: ";
        std::cin >> phoneNumber;

        Date::input();
    }

    int getDaysBeforeBirthDay() {
        Date* date = new Date();

        std::cout << "Enter current date:" << std::endl;
        date->input();

        int dayBefore;
        int monthBefore;
        int yearBefore;

        yearBefore = abs(this->getYear() - date->getYear()) * YEAR;

        monthBefore = abs(this->getMonth() - date->getMonth()) * MONTH;

        dayBefore = abs(this->getDay() - date->getDay()) + monthBefore;

        std::cout << "Days before birthday: " << dayBefore << std::endl;

        delete date;
        return dayBefore;
    }
};

int main() {
    NoteBook notebook;
    notebook.input();
    notebook.show();
}

2 Востаннє редагувалося wander (31.03.2021 22:16:41)

Re: Помилка в коді

По-перше, я не розумію, чого ви цим рядком хотіли добитися:

Date(Date(noteBook.getDay(), noteBook.getMonth(), noteBook.getYear()))

?
По-друге, тип noteBook -> 'const NoteBook', а ф-ї члени (геттери) у вас не константні.

3

Re: Помилка в коді

Постановка задачі: Описати клас ЗАПИСНИК на базі класу ДАТА, який містить Ф.І.О., телефон, дату народження та функцію обчислення кількості днів до дня народження.

Це код з лабораторної, який просто треба запустити, я не дуже розумію, що там повинно бути взагалі. Якщо б дозволили писати самому, а не здавати чужий код (+ вони приймають тільки це), то я б не запитував такі речі:( 
Я не зрозумів ваш другий пункт, вибачте

4 Востаннє редагувалося wander (31.03.2021 22:32:43)

Re: Помилка в коді

kerimov_e написав:

Постановка задачі: Описати клас ЗАПИСНИК на базі класу ДАТА, який містить Ф.І.О., телефон, дату народження та функцію обчислення кількості днів до дня народження.

Це код з лабораторної, який просто треба запустити, я не дуже розумію, що там повинно бути взагалі. Якщо б дозволили писати самому, а не здавати чужий код (+ вони приймають тільки це), то я б не запитував такі речі:(

Я щось не зрозумів, що з наведеного коду писали ви, а що ні?

kerimov_e написав:

Я не зрозумів ваш другий пункт, вибачте

Ну, ви не можете викликати не константний метод константного об'єкта.
Коли ви оголошуєте функцію-член як const,

class Date {
int getDay() const /* << отут */ { ... }
};

то ніби кажете компілятору, що ця ф-я нічого не змінить в об'єкті, скажемо так. Лише тоді можна буде викликати цей метод для константного об'єкта:

Date const date;
date.getDay(); // << тепер ОК
Подякували: kerimov_e, leofun012

5 Востаннє редагувалося kerimov_e (31.03.2021 22:42:43)

Re: Помилка в коді

Нічого я не писав, це приклад з лабораторної який просто необхідно запустити. Свій код неможна писати, тільки цей виправати на робочий. Мій викладач мабуть взагалі не знає програмування, або цю тему класів.
Але дякую, що пояснили!

6 Востаннє редагувалося wander (31.03.2021 23:16:54)

Re: Помилка в коді

Ну от, я вам вказав, що потрібно виправити.
У вас в конструкторі копіювання об'єкт теж константний

NoteBook(/* отут >> */const NoteBook& noteBook) : ...

, тепер звяжіть це з тим, що я написав вище і я, думаю, все запрацює.

Подякували: kerimov_e1

7

Re: Помилка в коді

Дякую, запрацювало!

Подякували: wander1