C++ 友元函数和私有构造函数

c++ friend function and the private constructor

本文关键字:构造函数 友元 函数 C++      更新时间:2023-10-16
#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();
}

上面的代码工作正常!

但我有以下问题:-

  1. 我尝试交换class Aclass B的位置,但它产生了一个错误,指出A::A()无法访问并尝试访问不完整的类型class B为什么?
  2. 谁能帮助我理解当你写friend A B::createA();它是否试图立即访问createA()的定义时发生了什么。

这个有问题的部分是B::createA

在这里,您正在"进入"类型B以拉出其成员函数createA。为此,您需要知道完整的类型B.否则,编译器如何知道在哪里可以找到该成员函数,或者它是否存在?

为了声明友元成员函数,从编译器实现的严格技术角度来看,这不是必需的。毕竟,此时您不执行任何函数调用,因此此处无需解决任何问题。但这仍然是有问题的,因为我也可以写B::thisfunctiondoesnotexist,编译器也必须接受它。因此,该语言选择要求在您使用::拉出其某些内部时事先知道完整类型。

解决此限制的一种简单方法(例如,如果您需要避免类之间的循环依赖关系(是将createA的功能放入自由函数而不是成员函数中。依赖于AB的自由函数仍然可以声明,如果此时类型仅被前向声明,但尚未定义。