【问题标题】:class not being recognized as friend班级不被认作朋友
【发布时间】:2014-12-03 05:31:09
【问题描述】:

我有两个班级,分别是 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() [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|error: ‘foo::foo()’ 是 私人| ||=== 构建完成:1 个错误,2 个警告(0 分钟,5 秒)===|

是因为 bar.h 是先构建的吗?如果是这样,有什么建议可以解决这个问题吗?

【问题讨论】:

  • bar 可能是foo 的朋友,但boost::make_shared 不是。直接使用boost::shared_ptr 构造函数。

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


【解决方案1】:

我使用的是boost::shared_ptr,但为简单起见,我在这里没有提及

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

问题是您尝试使用boost::make_shared 创建shared_ptr。这将导致make_shared 尝试构造foo,这当然会失败,因为您已将bar 声明为foofriend,但make_shared 不是@ 987654331@.

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

Live demo


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

【讨论】:

    猜你喜欢
    • 2015-04-03
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多