在make_unique中使用此*



我有一个Factory设计模式的小例子,我对这部分感兴趣:

std::make_unique< A >(*this)

。尤其是*this.

这是否意味着clone()方法返回指向工厂类成员的std::unique_ptrcreateInstance()总是返回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();
}

std::make_unique<A>(*this)基本上等价于:

unique_ptr<A>(new A(*this))

clone()中,*this是对A的左值引用,所以你从一个(左值引用(A(在std::make_unique内部(构造一个A,所以你使用的是隐式声明的A的复制构造函数:

A(A const&);

因此,您实际上是将当前对象的副本复制到新分配的内存块中。

由于createInstance使用clone(),因此每次调用createInstance时,您都会创建type的"副本"。

相关内容

  • 没有找到相关文章

最新更新