我有两个班级foo
和bar
。 foo
的构造函数是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首先构建了吗?如果有,有关如何解决此问题的任何建议吗?
答案 0 :(得分:3)
我正在使用
boost::shared_ptr
但是为了简单起见,我在这里没有提到它
具有讽刺意味的是,这正是使你的代码无法编译的原因。没有它,您显示的示例编译没有错误。
问题是您尝试使用boost::make_shared
来创建shared_ptr
。这会导致make_shared
尝试构建foo
,这当然会失败,因为您已将bar
声明为friend
的{{1}} ,但foo
不是make_shared
。
直接使用friend
构造函数,并将指针传递给shared_ptr
已分配的foo
对象。
请注意,将bar
声明为boost::make_shared
并不是一个可靠的解决方案,因为它可能会将实际构造委托给其他函数。