gpt4 book ai didi

c++ - 基础接口(interface)的 shared_ptr 的初始化和管理

转载 作者:太空狗 更新时间:2023-10-29 21:32:51 25 4
gpt4 key购买 nike

我有一些关于使用指向基类的 shared_ptr 的问题。他们的答案相互影响,对于所有三个,我需要相同的代码片段来以尽可能少的方式设置上下文,比如 this (所有问题都与 Foo 及其 held_object_ 相关):

#include <memory>
#include <utility>

class Bar // interface for Scene (see linked question)
{
public:
virtual ~Bar() = 0;
// more virtual methods to work with Scene
};

Bar::~Bar() = default;

class Baz : public Bar // interface for Foo
{
public:
virtual ~Baz() = 0;
// more virtual methods to work with Foo
};

Baz::~Baz() = default;

class ConcreteBaz : public Baz // actual thing I'm acquiring and releasing
{
// overrides and whatnot
};

class Foo
{
public:
void acquire(const std::shared_ptr<Baz>& object) {};
void release(/* actually takes a place to release into */) {};

private:
std::shared_ptr<Baz> held_object_;
};

int main()
{
auto foo = std::make_unique<Foo>();
auto p_foo = foo.get();

while (/* condition */)
{
auto cbaz = std::make_shared<ConcreteBaz>();
// Scene gets a copy here

p_foo->acquire(cbaz);
// do physical things to cbaz
p_foo->release(/* actually takes a place to release into */);

// do other physical things, then acquire cbaz again

p_foo->acquire(cbaz);
// do physical things to cbaz
p_foo->release(/* actually takes a place to release into */);
}
}

如你所见cbaz是一个指向多态层次结构的指针,它可以与 Scene 一起使用和 Foo . ConcreteBaz实际上代表一个物理实体,它是Foo可以,如代码中所述,取得所有权(它是一个 shared_ptr,因为 SceneFoo 都拥有它,根据 this。我在这里删除了 Scene 的详细信息,因为它是 OT)。

问题

1) 如何初始化 held_object_ ?我可以通过一次分配来完成吗?

实际上,foo不拥有cbaz直到它(物理上)得到它,因此构造函数应该初始化指向 nullptr 的指针。最初我想使用 make_shared根据 this但我读了here它进行值初始化,这意味着如果我要这样做

Foo::Foo()
: held_object_ {std::make_shared<Baz>()} // equivalent to std::make_shared<Baz>(nullptr)
{
}

编译器会提示 error: invalid new-expression of abstract class type .这因此成为this的拷贝问题,但接受的答案要么留下 shared_ptr未初始化或创建进一步的 unique_ptr到...基本上不清楚我将如何在这里应用它,而且我认为我不能调用 reset在构造函数中(?)。

我应该明确地说

Foo::Foo()
: held_object_ {std::shared_ptr<Baz> {nullptr}}
{
}

不关心 make_shared 的双重分配避免?在这一点上,它不会与 : held_object_ {} 几乎完全相同吗? (将 ctor 与默认 ctor 放在一边)?编辑:我也可以用一个分配来做吗,比如 make_shared does

2) 我如何管理 held_object_

立即获得 cbaz 的所有权打电话后 acquire我最终进入了方法调用

void Foo::setHeldObject_(std::shared_ptr<Baz> object)
{
this->held_object_ = std::move(object);
}

然而在release我将不得不销毁拥有 shared_ptr (然后在下一个循环中再次设置它)并使我的状态 Foo实例与其物理状态 IRL 一致。这让我想到使用 std::shared_ptr::reset (甚至在阅读之前的相关答案之前)因为如果我调用 setHeldObject(),我会用 nullptr 替换指针对象并设置 cbaz否则。但是我无法将方法主体的正确语法计算为:

  • this->held_object_.reset(object);显然是错误的,因为我想管理指针,而不是指针(因此不编译);
  • this->held_object_.reset(&object);看起来不对,并产生 error: cannot convert ‘std::shared_ptr<Baz>*’ to ‘Baz*’ in initialization
  • this->held_object_.reset(object.get());也似乎是错误的,因为我认为我没有提高 user_count这样(虽然它确实编译)。

编辑:我相信应该可以通过相同的方法调用来完成,给出或不给出参数。 reset 有可能吗? ?

3)真的只有两个所有者

main我这里写的函数其实是一个Process类' run方法,但是像这样定义它使得 use_count 在 Scene 时达到 3和 Foo有自己的shared_ptr .从我什么时候开始make_shared之后,我进入了一个循环,而且逻辑上说应该只有两个所有者。这是 weak_ptr 的用例吗?做这样的事情可能有意义:

int main()
{
auto foo = std::make_unique<Foo>();
auto p_foo = foo.get();

while (/* condition */)
{
auto cbaz = std::make_shared<ConcreteBaz>();
auto p_cbaz = std::weak_ptr<ConcreteBaz> {cbaz};
// Scene gets a && via std::move here

p_foo->acquire(p_cbaz.lock()); // this instantly gets converted to a shared_ptr EDIT: BUT IT DOESN'T INCREASE THE USE COUNT
// do physical things to cbaz
p_foo->release(/* actually takes a place to release into */);

// do other physical things, then acquire cbaz again

p_foo->acquire(p_cbaz.lock()); // this instantly gets converted to a shared_ptr and would be nullptr had I moved in the first acquire call EDIT: BUT IT DOESN'T INCREASE THE USE COUNT
// do physical things to cbaz
p_foo->release(/* actually takes a place to release into */);
}
}

或者有更好的方法吗?

最佳答案

How do I initialize held_object_

如果您希望held_object_nullptr,那么您无需执行任何操作。编译器生成的 Foo 的默认构造函数将调用 held_object_ 的默认构造函数,将其保留为空指针。

How do I manage held_object_

当您需要释放指针的所有权时,您只需调用不带任何参数的reset。这有效地执行了 shared_ptr().swap(*this);,这给您留下了一个空指针。

关于c++ - 基础接口(interface)的 shared_ptr 的初始化和管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53615396/

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