C++ 友元函数和私有构造函数
c++ friend function and the private constructor
#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();
}
上面的代码工作正常!
但我有以下问题:-
- 我尝试交换
class A
和class B
的位置,但它产生了一个错误,指出A::A()
无法访问并尝试访问不完整的类型class B
为什么? - 谁能帮助我理解当你写
friend A B::createA();
它是否试图立即访问createA()
的定义时发生了什么。
这个有问题的部分是B::createA
。
在这里,您正在"进入"类型B
以拉出其成员函数createA
。为此,您需要知道完整的类型B
.否则,编译器如何知道在哪里可以找到该成员函数,或者它是否存在?
为了声明友元成员函数,从编译器实现的严格技术角度来看,这不是必需的。毕竟,此时您不执行任何函数调用,因此此处无需解决任何问题。但这仍然是有问题的,因为我也可以写B::thisfunctiondoesnotexist
,编译器也必须接受它。因此,该语言选择要求在您使用::
拉出其某些内部时事先知道完整类型。
解决此限制的一种简单方法(例如,如果您需要避免类之间的循环依赖关系(是将createA
的功能放入自由函数而不是成员函数中。依赖于A
和B
的自由函数仍然可以声明,如果此时类型仅被前向声明,但尚未定义。
相关文章:
- C++模板来检查友元函数的存在
- 如何使用单独文件中的派生类访问友元函数对象
- C++ 友元函数和私有构造函数
- 使第二个类的构造函数成为第一个类中的友元函数
- 将派生类的构造函数声明为父类的友元
- 模板和隐式构造函数的类定义之外的友元声明
- 正确的友元定义,以授予 std::map 对私有默认构造函数的访问权限
- 为什么我不能实例化其构造函数在友元类中私有的类
- 使typedef的构造函数/赋值运算符成为友元函数
- 友元函数无法构造类的唯一指针
- 通过友元类访问私有构造函数
- 在基/派生类的成员函数/友元函数中派生* 到 Base* 的转换
- 使用友元类的构造函数
- C++库制作,隐藏在标头中没有友元的析构函数/构造函数
- 不允许在友元函数中调用私有构造函数
- 友元函数和复制构造函数
- 模板、友元类及其构造函数
- 友元类不能调用私有构造函数
- 带有新类型/类和友元的c++重载构造函数
- 模板类的非模板函数友元