gpt4 book ai didi

c++ - 在将 unique_ptr 移动到同一对象的基类构造后,使用指向对象的原始指针初始化字段

转载 作者:行者123 更新时间:2023-12-01 14:13:02 27 4
gpt4 key购买 nike

我有一个对象 FooOwner 所有没有其他人。我创建了一个 Derived 类的对象继承 Owner , 传递一个 unique_ptr到新创建的 Foo . Derived有一个类 User 的成员那也需要使用Foo ,但不拥有它,所以它只得到一个指向它的原始指针。

#include <memory>
#include <iostream>
using namespace std;

struct Foo {
void talk() { cout << "foo" << endl; }
};

struct User {
Foo *foo;
User(Foo *_foo): foo(_foo) {};
void use() { foo->talk(); } //potential disaster if foo's memory has changed
};

struct Owner {
unique_ptr<Foo> foo;
Owner(unique_ptr<Foo> _foo): foo(move(_foo)) {};
};

struct Derived : public Owner {
User user;
Derived(unique_ptr<Foo> _foo)
: Owner {move(_foo)},
user{_foo.get()} //potential disaster: _foo has already been move()'d, can't get()!
{};
void use() { user.use(); };
};

int main() {
Derived d(make_unique<Foo>());
//do other stuff
d.use(); //potential disaster
}

问题是在Derived的初始化列表中, 我需要 move() Foo将其传递给 Owner的构造函数(接受 unique_ptr<Foo> ,因为它是所有者),并将原始指针传递给 FooUser .但是到了User被初始化,unique_ptr<Foo>已被移动和 foo.get()可能指向无效的位置!

有什么好方法可以确定User获得指向 Foo 的有效(非拥有)指针和 Owner仍然得到它的unique_ptr<Foo> ?

最佳答案

您可以使基类的成员 protected (或某些更高的可访问性)并引用基类成员

Derived(unique_ptr<Foo> _foo)
: Owner {move(_foo)},
user{foo.get()} // refers to Owner::foo

关于c++ - 在将 unique_ptr 移动到同一对象的基类构造后,使用指向对象的原始指针初始化字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63379450/

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