我有一个基类:
class Base {
public:
Base(??? new_p) : p(new_p) {}
std::unique_ptr<MyType> p;
}
派生类:
class Derived : public Base {
Derived(??? new_p) : Base(new_p) {}
}
如果我想构建Derived
,我会用什么类型替换问号?其他改变也没关系。我想确保构建Derived
而不复制MyType
指向的p
。
答案 0 :(得分:1)
取决于您想要支持的内容 - 从MyType*
或std::unique_ptr<MyType>&&
开始,下面的一个或两个构造函数都有意义,这需要调用者提供可移动的unique_ptr
。简单地使用std::unique_ptr<MyType>
也可以,因为std::unique_ptr
有一个来自其他可移动实例的构造函数...只是一个品味问题,是否要强调调用者传入的必然瞬态性质{ {1}}在您自己的代码中。
unique_ptr
看到它正在运行here
答案 1 :(得分:1)
我将???
替换为std::unique_ptr<MyType>
,然后将std::move
替换为mem-initializer。
class Base {
public:
Base(std::unique_ptr<MyType> new_p) : p(std::move(new_p)) {}
std::unique_ptr<MyType> p;
};
class Derived : public Base {
Derived(std::unique_ptr<MyType> new_p) : Base(std::move(new_p)) {}
};
您也可以使用std::unique_ptr<MyType>&&
代替std::unique_ptr<MyType>
并避开std::move
但我更喜欢按价值方法,因为this answer中列出的原因。
我建议不要采用MyType *
参数。该解决方案的问题在于它没有向用户传达您获取传递给构造函数的指针的所有权的意图。
答案 2 :(得分:0)
这对我有用。 编辑注意我只使用字符串作为类型以使其更易于阅读,您必须将其替换为您的类型。
#include <memory>
#include <string>
#include <iostream>
#include <utility>
class Base {
public:
Base(std::unique_ptr<std::string> new_p)
: p(std::move(new_p)) {}
std::unique_ptr<std::string> p;
};
class Derived : public Base {
public:
Derived(std::unique_ptr<std::string> new_p)
: Base(std::move(new_p)) {}
};
int main(){
std::unique_ptr<std::string> text(new std::string("Hello world"));
Derived a(std::move(text));
std::cout << *(a.p);
}