c++ make_unique中this* 的用法

lvjbypge  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(303)

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

  1. std::make_unique< A >(*this)

特别是*this
是否意味着clone()方法返回一个指向工厂类成员的std::unique_ptrcreateInstance()总是返回Factory类的相同成员吗?
我只是不明白std::make_unique< A >(*this)应该做什么,因为A在构造函数中有std::string,而不是指向自身的指针。

  1. class Base {
  2. public:
  3. virtual ~Base() {}
  4. virtual std::unique_ptr<Base> clone() = 0;
  5. virtual void print() = 0;
  6. };
  7. class A: public Base {
  8. std::string name_;
  9. public:
  10. A(std::string name ){name_ = name;};
  11. std::unique_ptr<Base> clone() override{
  12. return std::make_unique<A>(*this);
  13. };
  14. void print( ) override{
  15. std::cout << "Class A: " << name_;
  16. };
  17. virtual ~A(){};
  18. };
  19. class Factory{
  20. std::unique_ptr<A> type = std::make_unique<A>("MyName");
  21. public:
  22. std::unique_ptr<Base> createInstance(){
  23. return type->clone();
  24. }
  25. };
  26. int main(){
  27. Factory factory;
  28. auto instance = factory.createInstance();
  29. instance->print();
  30. }
c86crjj0

c86crjj01#

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

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

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

  1. A(A const&);

因此,您实际上是将当前对象的副本复制到新分配的内存块中。
由于createInstance使用clone(),因此每次调用createInstance时都在创建type的“副本”。

gdx19jrr

gdx19jrr2#

我很困惑,现在类A有一个虚析构函数virtual ~A(){},它将不再生成一个复制构造函数。那么,为什么std::make_unique<A>(*this)可以调用A的隐式声明的复制构造函数呢?

相关问题