C++ 带友元函数的转发声明:不完整类型的使用无效 #包括 乙级;; 甲级{ INTA; 公众: 朋友void B::frndA(); }; B类{ int b; 公众: 无效frndA(); }; void B::frndA(){ obj; std::cout
将整个C++ 带友元函数的转发声明:不完整类型的使用无效 #包括 乙级;; 甲级{ INTA; 公众: 朋友void B::frndA(); }; B类{ int b; 公众: 无效frndA(); }; void B::frndA(){ obj; std::cout,c++,forward-declaration,friend-function,C++,Forward Declaration,Friend Function,将整个class B…声明放在class A之前。您尚未声明B::frndA(); #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 <
class B…
声明放在class A
之前。您尚未声明B::frndA();
#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;
}
#包括
使用名称空间std;
B类{
int b;
公众:
无效frndA();
};
甲级{
INTA;
公众:
朋友void B::frndA();
};
void B::frndA(){
obj;
//cout您需要将B
的声明放在A
之前。编译器不知道这一点:B::frndA()
。前向声明不足以推断类型的成员
我建议将您的类A
声明放在文件A.h
中,它的定义放在文件A.cpp
中。同样,对于B.h
和B.cpp
中的类型B
也是如此
在每个头文件的顶部放置一次#pragma
(或者如果您希望包含卫士)
然后在B.h
中,您可以简单地包含A.h
问题是,在编译器看到声明之前,您不能与成员函数交朋友
您需要重新排列代码以解决问题(即将B类
的定义移到A类
之前).我已经重新标记了这个问题。friend
不是最有用的关键字之一。另外,转发声明
组合在一个标记中更有意义。编辑:哦和类
也比函数
我想:)事实上,当同一个文件位于不同的搜索路径中时,pragma一次可能会失败因为它基于路径而不是文件的内容。所有主要编译器都支持pragma once。我不认为#pragma once可以被否决。请参见此处:
#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;
}