Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;友元函数与私有构造函数 #包括 使用名称空间std; 甲级; B类{ 公众: A createA(); }; 甲级{ 私人: (){ cout_C++_Oop - Fatal编程技术网

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();
}