Функция перегрузки не может достать до переменной класса

Всем привет. Проблема следующая: Мне нужно реализовать 4 бинарных оператора функции-перегрузки. Я попробовал реализовать оператор +, и вроде бы получилось, однако, не получается получить переменную в классе, и выдает следующую ошибку:

C2065: pagesLeft: необъявленный идентификатор C2065: pagesLeft: необъявленный идентификатор

Так же еще случалась похожая ошибка, где говорилось что-то о том, что не получается получить private переменную класса.

Вот объявление класса, функций и переменных:

class diary {
    mutable int pagesLeft; // переменная до которой не может достать
    int numOfSongs;
    int numOfArtists;
    int numOfAlbums;
    int numOfGenres;
    int numOfPages;
    int numOfFiles;
    int readedPages;
    float Ink;
    double diaryWidth;
    double diaryHeight;
    bool state;
    int info;
    string diaryName;
    string diaryLan;
    string diaryAuthor;

public: 
    friend diary operator + (diary&);
    friend int operator *= (diary&, int);
    diary();
    diary(double, double);
    diary(int);
    diary(int numOfSongs, 
          int numOfArtists, 
          int numOfAlbums,
          int numOfGenres, 
          int numOfPages);
    ~diary();
    void operator = (bool);
    int operator += (int);
    int operator -= (int);
    void Func(diary value); 
    void reset(void);   
    void changeSong(void);
    void changeArtist(void);
    void changeAlbums(void);
    void changeGenres(void);
    void changeState(void);
    void getPages(void);
    void diaryInfo(void);
    void changeDiaryName(void);
    void changeDiaryLan(void);
    void changeDiaryAuthor(void);
    int loadSongs(int);
    int unloadSongs(int);
}; 

Вот сами перегрузки:

diary operator + (diary& readedPages) {
    return diary(pagesLeft + readedPages.pagesLeft);
}

diary operator + (diary&, int readedPages) {
    return diary(pagesLeft + readedPages);
}

Заголовочный файл с классом подключен. Не могу найти проблему. Пробовал еще через this->pagesLeft, ошибка исчезала, но выдавало: this может указываться только в нестатических членах-функциях, а потом прочитал, что вроде так нельзя делать( Такое чувство, что я где-то фэйлю в обращении класса, когда пишу перегрузку, но в примере который нам давали все сделано точно так же.

P.S: Насколько я знаю, та перегрузка, что я написал по сути своей унарная, но мне хотя бы с этого начать.


Ответы (1 шт):

Автор решения: Mikhailo

Как только вы описываете friend — вы описываете не члены класса, а внешние (свободные) функции. Для которых нет и не может быть this, так как они вызываются без объектов.

Сделайте эти операторы членами класса (особенно типа +=).

diary operator + (const diary& readedPages) {
    return diary(pagesLeft + readedPages.pagesLeft);
    };

Оператор

diary operator + (diary&, int readedPages)

и в самом деле должен быть свободным, для него надо передавать первый аргумент - а вы его не передаете:

diary operator + (const diary& d, int readedPages) {
    return diary(d.pagesLeft + readedPages);
    }

Вот:

class diary {
    mutable int pagesLeft;
    int numOfSongs;

public: 
    diary operator + (const diary& rPages) {
        return diary(pagesLeft + rPages.pagesLeft);
        };

    friend diary operator + (const diary& d, int readedPages);
    diary() {};
    diary(int) {};
    };

diary operator + (const diary& d, int readedPages) {
    return diary(d.pagesLeft + readedPages);
    }
→ Ссылка