Использование этого * в make_unique - PullRequest
0 голосов
/ 28 мая 2018

У меня есть небольшой пример шаблона проектирования 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();
}

1 Ответ

0 голосов
/ 28 мая 2018

std::make_unique<A>(*this) в основном эквивалентно:

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

В clone(), *this является lvalue-ссылкой на A, поэтому вы создаете A из (lvalue)-ссылка на) A (внутри std::make_unique), поэтому вы используете неявно объявленный конструктор копирования A:

A(A const&);

Таким образом, вы фактически делаете копию текущего объекта внедавно выделенный блок памяти.

Поскольку createInstance использует clone(), вы создаете «копию» type каждый раз, когда вызываете createInstance.

...