6
#include <iostream>

class B;

class A{
 int a;
public:
 friend void B::frndA();
};

class B{
 int b;
public:
 void frndA();
};

void B::frndA(){
 A obj;
 std::cout << "A.a = " << obj.a << std::endl;
}

int main() {
 return 0;
}

尝试编译此代码时,发生了一些错误。例如

不完整类型的无效使用

这段代码有什么问题?

4

3 回答 3

3

问题是在编译器看到声明之前你不能为成员函数加好友。

您将需要重新排列代码以解决问题(即移动class B之前的定义class A)。

于 2010-07-06T05:37:08.343 回答
3

将整个class B ...声明放在前面class A。你还没有宣布B::frndA();

#include <iostream>
using namespace std;

class B{
    int b;
public:
    void frndA();
};

class A{
    int a;
public:
    friend void B::frndA();
};



void B::frndA(){
    A obj;
    //cout<<"A.a = "<<obj.a<<endl;
}

int main() {
    return 0;
}
于 2010-07-06T05:35:10.487 回答
2

你需要把Bbefore的声明A。编译器不知道这一点:B::frndA(). 前向声明不足以推断该类型具有哪些成员。

我建议将您的类A声明放在一个文件中A.h,并将它的定义放在一个文件A.cpp中。和B里面的类型也一样B.hB.cpp

在每个头文件的顶部放置#pragma once(或者如果您更喜欢包含警卫)。

然后在你的里面B.h你可以简单地包含A.h.

于 2010-07-06T05:35:37.650 回答