#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。
无效使用不完整类型
此代码中存在哪些问题?
答案 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
中。对B
和B.h
B.cpp
类型也是如此
在每个标题文件的顶部放置#pragma once
(或者如果您更喜欢包含警卫)。
然后在B.h
内,你可以简单地加入A.h
。
答案 2 :(得分:2)
问题是在编译器看到声明之前你不能成为成员函数的朋友。
您需要重新安排代码才能解决问题(即在class B
之前移动class A
的定义。)