Классы и функция друга между ними - PullRequest
0 голосов
/ 21 сентября 2018

Я изучаю класс и функцию друга.Я хочу, чтобы функция eat () из класса Farm имела доступ к переменной цене из класса Bull и изменила значение цены.Поэтому мне нужно реализовать функцию друга.У меня проблема с использованием функции, так как я не понимаю, как ее использовать.Я получил эти ошибки:

gcc friendFClass.cc -lstdc++ -o friendFClass 
friendFClass.cc: In member function 'void Farm::eat(Bull)':
friendFClass.cc:43: error: 'class Bull' has no member named 'eat'
friendFClass.cc: In function 'int main()':
friendFClass.cc:54: error: 'class Bull' has no member named 'eat'

для этой программы:

#include <iostream>

class Bull; // declaration not full of Bull

class Farm { // declaration full of Farm

    double sizeFarm;
    double massBull;


    public:
    void eat(Bull eatingBull); // Ok Bull was declared 
    void init(double size, double mass) {
        this -> sizeFarm = size;    
        this -> massBull = mass;
    }
    void print() {
        std::cout << "size of the Farm: " << sizeFarm << "\nmass of a bull: " << massBull << std::endl;
    }

};

class Bull {

    int eatBullThisMonth;
    int price;

    friend void Farm::eat(Bull eatingBull); // Ok Farm was full deblared

    public:
    void init(int price) {
        this -> price = price;
    }
    void print() {
        std::cout << "Number of bull for the month: " << eatBullThisMonth << std::endl;
        std::cout << "Total price : " << price << std::endl;
    }

};

void Farm::eat(Bull eatingBull) {
    int pPrice = 12 * eatingBull.price;
    eatingBull.eat(pPrice);
    eatingBull.print();
}

int main() {
    Farm delacroix;
    Bull marguerite;

    delacroix.init(1260, 123);
    marguerite.init(159);

    marguerite.eat(); 

    return 0;

}

Я не знаю, где определить функцию друга, внутри или снаружи фермы классов и как ее определить.
Спасибо.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Теперь проблема в порядке, так как это было неправильное использование функции и неправильное использование вызова функции.Вот правильный код.

#include <iostream>

class Bull; // declaration not full of Bull

class Farm { // declaration full of Farm

    double sizeFarm;
    double massBull;


    public:
    void eat(Bull eatingBull); // Ok Bull was declared 
    void init(double size, double mass) {
        this -> sizeFarm = size;    
        this -> massBull = mass;
    }
    void print() {
        std::cout << "size of the Farm: " << sizeFarm << "\nmass of a bull: " << massBull << std::endl;
    }

};

class Bull {

    int eatBullThisMonth;
    int price;

    friend void Farm::eat(Bull eatingBull); // Ok Farm was full deblared

    public:
    void init(int price) {
        this -> price = price;
    }
    void print() {
        std::cout << "Number of bull for the month: " << eatBullThisMonth << std::endl;
        std::cout << "Total price : " << price << std::endl;
    }

};

void Farm::eat(Bull eatingBull) {
    int pPrice = 12 * eatingBull.price;
    eatingBull.init(pPrice); 
    eatingBull.print();
}

int main() {
    Farm delacroix;
    Bull marguerite;

    delacroix.init(1260, 123);
    marguerite.init(159);

    delacroix.eat(marguerite); 

    return 0;

}
0 голосов
/ 21 сентября 2018

Объявление функции как friend в другом классе означает, что она может обращаться к своим закрытым членам, а не к тому, что она наследует метод.В этом случае это означает, что Farm::eat имеет доступ к Bull закрытым членам, но Bull не наследует Farm::eat.

...