0

我有两个班级说foobar。的构造函数fooprivate允许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() [with T = bar; 类型名 boost::detail::sp_if_not_array::type = boost::shared_ptr]':| /home/../Projects/CodeBlocks/../bar.cpp|18|从这里需要| /home/../Projects/CodeBlocks/../foo.h|23|错误:'foo::foo()' 是私有的| ||=== 构建完成:1 个错误,2 个警告(0 分钟,5 秒)===|

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

4

1 回答 1

3

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

具有讽刺意味的是,这正是使您的代码无法编译的原因。没有它,您展示的示例编译时不会出错。

问题是您正在尝试使用boost::make_shared来创建shared_ptr. 这将导致make_shared尝试构造 a foo,这当然会失败,因为您已声明bar为 a friendof foo,但make_shared不是 a friend

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

现场演示


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

于 2014-12-03T05:42:22.623 回答