我有一个Factory
设计模式的小例子,我对这部分感兴趣:
std::make_unique< A >(*this)
特别是*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();
}
2条答案
按热度按时间c86crjj01#
std::make_unique<A>(*this)
基本上等价于:在
clone()
中,*this
是A
的左值引用,所以你是从A
(在std::make_unique
内部)的(左值引用)构造A
,所以你使用的是A
的隐式声明的复制构造函数:因此,您实际上是将当前对象的副本复制到新分配的内存块中。
由于
createInstance
使用clone()
,因此每次调用createInstance
时都在创建type
的“副本”。gdx19jrr2#
我很困惑,现在类A有一个虚析构函数
virtual ~A(){}
,它将不再生成一个复制构造函数。那么,为什么std::make_unique<A>(*this)
可以调用A的隐式声明的复制构造函数呢?