wai*_*r92 3 c++ smart-pointers factory-pattern unique-ptr c++11
我有一个Factory设计模式的小例子,我对这部分感兴趣:
std::make_unique< A >(*this)
Run Code Online (Sandbox Code Playgroud)
......尤其如此*this.
这是否意味着该clone()方法返回一个std::unique_ptr指向工厂类成员的?并且createInstance()总是返回同一个Factory类的成员?
我只是混淆std::make_unique< A >(*this)应该做什么,因为A在构造函数中std::string,而不是指向自身的指针.
class Base {
public:
virtual ~Base() {}
virtual std::unique_ptr<Base> clone() = 0;
virtual void print() = 0;
};
class A: public Base {
std::string name_;
public:
A(std::string name ){name_ = name;};
std::unique_ptr<Base> clone() override{
return std::make_unique<A>(*this);
};
void print( ) override{
std::cout << "Class A: " << name_;
};
virtual ~A(){};
};
class Factory{
std::unique_ptr<A> type = std::make_unique<A>("MyName");
public:
std::unique_ptr<Base> createInstance(){
return type->clone();
}
};
int main(){
Factory factory;
auto instance = factory.createInstance();
instance->print();
}
Run Code Online (Sandbox Code Playgroud)
std::make_unique<A>(*this) 基本上相当于:
unique_ptr<A>(new A(*this))
Run Code Online (Sandbox Code Playgroud)
在clone(),*this是一个左值引用A,所以你正在构造一个A(左值引用)A(内部std::make_unique),所以你使用隐式声明的复制构造函数A:
A(A const&);
Run Code Online (Sandbox Code Playgroud)
因此,您实际上将当前对象的副本复制到新分配的内存块中.
自createInstance使用以来clone(),您type每次打电话时都会创建一个"副本" createInstance.