2014-12-03 178 views
0

我有两个班级,分别为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但为了简单起见,我没有在这里提到它

然而,当我试图建立程序出现错误

In instantiation of ‘typename boost::detail::sp_if_not_array::type boost::make_shared() [with T = bar; typename boost::detail::sp_if_not_array::type = boost::shared_ptr]’:| /home/..../Projects/CodeBlocks/../bar.cpp|18|required from here| /home/..../Projects/CodeBlocks/../foo.h|23|error: ‘foo::foo()’ is private| ||=== Build finished: 1 errors, 2 warnings (0 minutes, 5 seconds) ===|

是因为bar.h首先建成?如果是这样,关于如何解决这个问题的任何建议?

+1

'bar'可能是'foo'的朋友,但'boost :: make_shared'不是。直接使用'boost :: shared_ptr'构造函数。 – Praetorian 2014-12-03 05:36:11

回答

3

I am using boost::shared_ptr however for simplicity I did not mention it here

具有讽刺意味的是,这是让你的代码无法编译的东西。没有它,你显示的例子编译没有错误。

问题是,您正尝试使用boost::make_shared来创建shared_ptr。这会导致make_shared尝试构建foo,这当然会失败,因为您已宣布barfoofriend,但make_shared不是friend

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

Live demo


注意,声明boost::make_sharedfriend不是一个可靠的解决方案可能是因为它可以委托实际施工中的一些其他功能。