class BaseShader {
std::unique_ptr<HandleInterface> handle_;
public:
BaseShader();
BaseShader(std::unique_ptr<HandleInterface> handle_ptr);
的.cpp
BaseShader::BaseShader(std::unique_ptr<HandleInterface> handle_ptr) {
handle_.reset(handle_ptr.get());
}
//BaseHandle implements HandleInterface
BaseShader::BaseShader():BaseShader(std::make_shared<BaseHandle>()) {
}
如何正确初始化unique_ptr handle_
?
我想像BaseShader s(std::make_shared<BaseHandle>());
Clang告诉我
error: no matching constructor for initialization of 'BaseShader'
BaseShader::BaseShader():BaseShader(std::make_shared<BaseHandle>()) {
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我可能搞砸了。
1。)我的构造函数参数是否正确? BaseShader::BaseShader(std::unique_ptr<HandleInterface> handle_ptr)
2。)如果1.)为真,handle_.reset(handle_ptr.get());
是否正确初始化handle_ unique_ptr?
答案 0 :(得分:11)
首先,您应该从成员初始化列表中的构造函数的参数std::move
中简单地handle_
:
BaseShader::BaseShader(std::unique_ptr<HandleInterface> handle_ptr)
: handle_(std::move(handle_ptr))
{ }
其次,当您需要std::make_shared
时,shared_ptr
会为您提供unique_ptr
。不幸的是,没有std::make_unique
(yet),所以你必须这样做:
BaseShader::BaseShader()
: BaseShader(std::unique_ptr<BaseHandle>(new BaseHandle()))
{ }
仅当BaseHandle
来自HandleInterface
时才会有效。
答案 1 :(得分:0)
回应约瑟夫的精彩回答,这是他第二点的最新消息:
其次,当您需要
javax.faces.FacesException: Error Instantiating: com.sun.faces.facelets.tag.composite.ImplementationHandler
时,std::make_shared
会为您提供shared_ptr
。不幸的是,没有unique_ptr
(yet),所以你必须这样做......
请注意,现在有std::make_unique
方法:
<强>的std :: make_unique 强>
构造一个T类型的对象并将其包装在std :: unique_ptr。
中1)构造一个非数组类型T.参数args传递给T的构造函数。如果T不是数组类型,则此重载仅参与重载解析。该功能相当于:
std::make_unique
2)构造一个未知边界T的数组。如果T是未知边界的数组,则此重载仅参与重载解析。该功能相当于:
unique_ptr<T>(new T(std::forward<Args>(args)...))
3)不允许构建已知界限的阵列。