首页 > 解决方案 > this* 在 make_unique 中的用法

问题描述

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

std::make_unique< A >(*this)

……尤其是*this

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

标签: c++c++11smart-pointersunique-ptrfactory-pattern

解决方案


std::make_unique<A>(*this)基本上相当于:

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

In clone(),*this是对 的左值引用,因此您正在从 (lvalue-reference to) (inside )A构造 a ,因此您使用的是 的隐式声明的复制构造函数:AAstd::make_uniqueA

A(A const&);

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

由于createInstance使用,您每次调用时都会clone()创建一个“副本” 。typecreateInstance


推荐阅读