为什么这个私有构造函数对其朋友不可访问

时间:2013-07-02 17:39:31

标签: c++ constructor g++ private friend

#include <iostream>

using namespace std;


class B {
private:
  class A;
  friend void f ( A Aobj );
  B ( int i ) {}
};

class A{
};


void f ( A Aobj ) {
  B Bobj ( 1 );
}

int main() {      
}

g ++产生以下错误:

$ g++ a.cpp
a.cpp: In function ‘void f(A)’:
a.cpp:10: error: ‘B::B(int)’ is private
a.cpp:18: error: within this context

如果进行以下任何更改,则错误消失: 1.从B的构造函数中删除“int i”。 2.将f的数据类型从A更改为其他任何内容:例如void f(int Aobj)。 3.在B之前定义A类,并删除A的前向声明。

2 个答案:

答案 0 :(得分:3)

问题是friend函数需要B::A,后面的函数在A中占用class A。将B的前向声明移出{{1}}。

答案 1 :(得分:0)

您已将B的构造函数 - 函数B(int i){}声明为私有方法。你想这样公开,如下:

class B {
private:
  class A;
  friend void f ( A Aobj );
public:
  B ( int i ) {}
};

** EDITED

如果你想保持构造函数是私有的,那应该不是问题。再看一遍,我意识到错误在于A类的前向声明。你在B的类定义中声明了A,然后尝试在f的函数头中使用它。问题是你没有完全定义A,所以你不能引用该对象 - 编译器不知道A占用了多少内存,因此无法定义该函数。要解决此问题,您需要在对其进行任何引用之前完全定义类A,或者切换f以获取指向A的指针(即void f (A* Aobj))。指针是固定大小的,因此即使尚未完全定义A,它们也可以使用。

相关问题