unique_ptr所有权语义

Ale*_*lec 5 c++ smart-pointers ownership-semantics unique-ptr

也许我试图过于通用.(下面的原始问题)具体来说,我有Dep一个类的依赖Foo.我也有一个班级MockDep,我正在定义一个班级TestFoo.这是我试图写的构造函数:

TestFoo(unique_ptr<MockDep> dep) : Foo(std::move(dep)), mock_dep_(dep.get()) {}
Run Code Online (Sandbox Code Playgroud)

Foo构造函数看起来像:

Foo(unique_ptr<Dep> dep) : dep_(dep) {}
Run Code Online (Sandbox Code Playgroud)

mock_dep_被指定TestFooMockDep* mock_dep_,并被dep_声明Foounique_ptr<Dep> dep_.我怎样才能mock_dep_包含dep_地址?(由于上述因为std::move(dep)空值而无效dep.)


原帖:

我有一个类型的对象Foo,我将传递给另一个类型的对象OtherObject声称它的所有权,但作为指向其基类的指针.但是,我想抓住一个指向我可以用来引用它的子对象的指针.我写了类似的东西:

Foo(std::unique_ptr<Child> thing) :
    OtherObject(std::move(thing)), child_(thing.get()) {}

OtherObject(std::unique_ptr<Base> thing, ...) { ... }
Run Code Online (Sandbox Code Playgroud)

但是,这似乎不起作用,因为std::move(thing)似乎使从thing.get()后面返回的指针无效.

我可以将Foo参数更改为类型Child*而不是unique_ptr<Child>,但我更愿意能够执行后者,因为它明确记录了所有权语义.

什么是最合适(或失败,不引人注目)的解决方法?

编辑:Foo并且OtherObject都是我正在定义的构造函数的类.

Jar*_*d42 6

你可以使用:

Foo(std::unique_ptr<Child> thing) :
    OtherObject(std::move(thing)),
    child_(OtherObject.getChildPtr()) /* one accessor to get the pointer. */
{}
Run Code Online (Sandbox Code Playgroud)

如果基础对象OtherObject不提供指针的访问器,则可以将构造函数委托给其他构造函数,例如:

class Foo: public OtherObject
{
public:
    Foo(std::unique_ptr<Child> thing) : Foo(thing, thing.get()) {}

private:
    Foo(std::unique_ptr<Child>& thing, Child* child) :
        OtherObject(std::move(thing)),
        child_(child)
    {}
private:
    Child* child_;
};
Run Code Online (Sandbox Code Playgroud)

第三个解决方案是改变的顺序之间OtherObjectchild_(有child_通过引入其它推导前):

class ChildPtr
{
public:
    ChildPtr(Child* child) : child_(child) {}

    Child* child_;
};

class Foo: private ChildPtr, public OtherObject
{
public:
    Foo(std::unique_ptr<Child> thing) :
        ChildPtr(thing.get()),
        OtherObject(std::move(thing))
    {}
};
Run Code Online (Sandbox Code Playgroud)