与朋友功能的前向声明:无效使用不完整类型

时间:2010-07-06 05:30:44

标签: c++ forward-declaration friend-function

#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;
}

尝试编译此代码时,发生了一些错误。 E.g。

  

无效使用不完整类型

此代码中存在哪些问题?

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

您需要在B之前加上A的声明。编译器不知道这个:B::frndA()。前向声明不足以推断出该类型的成员。

我建议将您的类A声明放在文件A.h中,并将其定义在文件A.cpp中。对BB.h

内的B.cpp类型也是如此

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

然后在B.h内,你可以简单地加入A.h

答案 2 :(得分:2)

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

您需要重新安排代码才能解决问题(即在class B之前移动class A的定义。)