C++ c++;友元函数与私有构造函数 #包括 使用名称空间std; 甲级; B类{ 公众: A createA(); }; 甲级{ 私人: (){ cout
这个有问题的部分是C++ c++;友元函数与私有构造函数 #包括 使用名称空间std; 甲级; B类{ 公众: A createA(); }; 甲级{ 私人: (){ cout,c++,oop,C++,Oop,这个有问题的部分是B::createA 这里,您正在“接触”类型B以拉出其成员函数createA。为此,您需要知道完整的类型B。否则,编译器如何知道在哪里找到该成员函数,或者它是否存在 为了声明友元成员函数,从编译器实现的严格技术角度来看,这是不必要的。毕竟,此时您没有执行任何函数调用,因此这里没有什么需要解决的问题。但这仍然会有问题,因为我还可以编写B::thisfunctiondoesnotextistd编译器也必须接受它。因此,当您使用:提取它的一些内部时,语言选择要求事先知道完整类型 解
B::createA
这里,您正在“接触”类型B
以拉出其成员函数createA
。为此,您需要知道完整的类型B
。否则,编译器如何知道在哪里找到该成员函数,或者它是否存在
为了声明友元成员函数,从编译器实现的严格技术角度来看,这是不必要的。毕竟,此时您没有执行任何函数调用,因此这里没有什么需要解决的问题。但这仍然会有问题,因为我还可以编写B::thisfunctiondoesnotextist
d编译器也必须接受它。因此,当您使用:
提取它的一些内部时,语言选择要求事先知道完整类型
解决此限制的一种简单方法(例如,如果您需要避免类之间的循环依赖关系)是将createA
的功能放在自由函数中,而不是放在成员函数中。如果仅在该点前向声明了类型,但未定义,则仍然可以声明同时依赖a
和B
的自由函数
#include <iostream>
using namespace std;
class A;
class B {
public:
A createA();
};
class A {
private:
A() {
cout << "A Object created" << endl;
}
friend A B::createA();
};
A B::createA() {
A a_obj;
return a_obj;
}
int main(int argc, char* argv[]) {
B b;
A a = b.createA();
}