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_被指定TestFoo为MockDep* mock_dep_,并被dep_声明Foo为unique_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都是我正在定义的构造函数的类.
你可以使用:
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)
第三个解决方案是改变的顺序之间OtherObject和child_(有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)