Два класса дружат друг с другом - PullRequest
3 голосов
/ 12 июня 2019

Я пытаюсь подружить два класса друг с другом, но получаю сообщение об ошибке «Использование неопределенного типа A».

Вот мой код:

Я пытался добавить класс A; как показано сверху, но все тот же.

#include <iostream> 
class A;
class B
{
private:
    int bVariable;
public:
    B() :bVariable(9){}
    void showA(A &myFriendA)
    {
        std::cout << "A.aVariable: " << myFriendA.aVariable << std::endl;// Since B is friend of A, it can access private members of A 
    }
    friend class A;
};
class A
{
private:
    int aVariable;
public:
    A() :aVariable(7){}
    void showB(B &myFriendB){
        std::cout << "B.bVariable: " << myFriendB.bVariable << std::endl;
    }
    friend class B;  // Friend Class 
};
int main() {
    A a;
    B b;
    b.showA(a);
    a.showB(b);

    system("pause");
    return 0;
}

Я пытаюсь сделать так, чтобы класс А получил доступ к классу В и наоборот через дружбу.

Ответы [ 2 ]

3 голосов
/ 12 июня 2019

Вы не можете получить доступ к myFriendA.aVariable, потому что компилятор не знает, что он существует.Все, что он знает, это то, что класс A существует (из-за предварительного объявления во второй строке), но он не был полностью определен, поэтому он не знает, каковы его члены / методы.

Если вы хотеличтобы это работало, showA () должно быть объявлено вне области видимости класса.

class A;
class B
{
private:
    int bVariable;
public:
    B() :bVariable(9){}
    void showA(A &myFriendA);

    friend class A;
};
class A
{
private:
    int aVariable;
public:
    A() :aVariable(7){}
    void showB(B &myFriendB){
        std::cout << "B.bVariable: " << myFriendB.bVariable << std::endl;
    }
    friend class B;  // Friend Class 
};

// Define showA() here
void B::showA(A &myFriendA)
{
    std::cout << "A.aVariable: " << myFriendA.aVariable << std::endl;
}

int main() {
    A a;
    B b;
    b.showA(a);
    a.showB(b);

    system("pause");
    return 0;
}
3 голосов
/ 12 июня 2019

Как указал @ user888379, перемещение реализации методов showA и showB после полного объявления обоих классов решит вашу проблему.Ниже приведен рабочий код:

#include <iostream> 

class A;

class B
{
private:
    int bVariable;
public:
    B() :bVariable(9){}
    void showA(A &myFriendA);
    friend class A;  // Friend Class 
};

class A
{
private:
    int aVariable;
public:
    A() :aVariable(7){}
    void showB(B &myFriendB);
    friend class B;  // Friend Class 
};

void B::showA(A &myFriendA) {
    std::cout << "A.aVariable: " << myFriendA.aVariable << std::endl; // Since B is friend of A, it can access private members of A 
}

void A::showB(B &myFriendB) {
    std::cout << "B.bVariable: " << myFriendB.bVariable << std::endl; // Since A is friend of B, it can access private members of B
}

int main() {
    A a;
    B b;
    b.showA(a);
    a.showB(b);
    return 0;
}

Прочитайте этот ответ для более подробного анализа.

...