上课不被视为朋友

时间:2014-12-03 05:31:10

标签: c++ boost shared-ptr friend boost-smart-ptr

我有两个班级foobarfoo的构造函数是private,以便只允许bar类实例化它。

// foo.h   
class foo
{
  friend class bar;
private:
  foo()
  {}
};

// bar.h
class bar
{
public:
  bar()
  {
    foo* f = new foo();
  } 
};

我也在使用boost::shared_ptr但是为了简单起见,我在这里没有提到它

然而,当我尝试构建程序时,我收到了错误

  

在'typename boost :: detail :: sp_if_not_array :: type的实例化中   boost :: make_shared()[用T = bar;类型名   boost :: detail :: sp_if_not_array :: type = boost :: shared_ptr]':|   /home/..../Projects/CodeBlocks/../bar.cpp|18|需要从这里|   /home/..../Projects/CodeBlocks/../foo.h|23|error:'foo :: foo()'是   私人| || ===构建完成:1个错误,2个警告(0分钟,5   秒)=== |

是因为bar.h首先构建了吗?如果有,有关如何解决此问题的任何建议吗?

1 个答案:

答案 0 :(得分:3)

  

我正在使用boost::shared_ptr但是为了简单起见,我在这里没有提到它

具有讽刺意味的是,这正是使你的代码无法编译的原因。没有它,您显示的示例编译没有错误。

问题是您尝试使用boost::make_shared来创建shared_ptr。这会导致make_shared尝试构建foo,这当然会失败,因为您已将bar声明为friend的{​​{1}} ,但foo不是make_shared

直接使用friend构造函数,并将指针传递给shared_ptr已分配的foo对象。

Live demo


请注意,将bar声明为boost::make_shared并不是一个可靠的解决方案,因为它可能会将实际构造委托给其他函数。