gpt4 book ai didi

c++ - 类未被识别为 friend

转载 作者:行者123 更新时间:2023-11-28 00:21:28 24 4
gpt4 key购买 nike

我有两个类 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 是先构建的吗?如果是这样,关于如何解决这个问题有什么建议吗?

最佳答案

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

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

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

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

Live demo


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

关于c++ - 类未被识别为 friend ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27264330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com