gpt4 book ai didi

c++ - 智能指针和不可复制的成员字段

转载 作者:行者123 更新时间:2023-11-30 05:24:31 25 4
gpt4 key购买 nike

在阅读了很多关于类成员上下文中的(智能)指针之后,我仍然不确定如何处理以下情况。

我想创建 Foo 类型的对象,要么通过调用实例化特定 Bar 对象的默认构造函数,要么通过将某种指针传递给 Foo 的单参数构造函数。

所以在下面的代码片段中(当然不能编译),m_bar 应该是什么类型?

struct Bar {
Bar(int k) {}
Bar operator=(const Bar&) =delete;
Bar (const Bar&) = delete;
};


struct Foo {

Foo() : m_bar(5) {}
Foo(Bar b) : m_bar(b);

Bar m_bar;
};

最佳答案

  • I can't use unique_ptr because I still need to access the Bar object outside of Foo.

unique_ptr 不会阻止您访问 Foo 之外的对象。

如果您的意思是“我仍然需要在 Foo 对象的生命周期之外访问 Bar 对象”,那么您的推理是合理的。在这种情况下,Foo 不能是对象的唯一所有者。

  • If I used raw pointers, then I would need to call delete if the deafult constructor of Foo was called but not if the one-arg ctr was called.

指针必须且只能由其所有者删除。通过声明 Foo 必须删除指针,您暗示 Foo 拥有该指针。

如果对象也可以被其他东西拥有,那么设计似乎会导致共享所有权。

  • Then there are shared_ptr, but quoting Herb Sutter "Don’t pass a smart pointer as a function parameter unless you want to use or manipulate the smart pointer itself, such as to share or transfer ownership."

根据描述,共享所有权 似乎正是您要尝试做的,Herb 明确将其列为传递智能指针的适当情况之一。


现在,由于所有权是有条件的“这里”或“那里”,共享指针并不是完全必要的。这只是最简单的解决方案,因此也是一个很好的解决方案。

您可以为您的情况想象一个maybe_unique_ptr。这样的智能指针在标准库中是不存在的。以下别名模板可能对您有用,但取决于提升:

template<class T>
using maybe_unique_ptr = boost::variant<std::unique_ptr<T>, T*>;

struct Foo {
Foo() : bar(std::make_unique<Bar>(5)) {}
Foo(Bar* b) : bar(b) {}

maybe_unique_ptr<Bar> bar;
};

这当然意味着你必须使用boost::apply_visitor来访问变体中的实例,这使得它更加繁琐。

关于c++ - 智能指针和不可复制的成员字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38640608/

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