ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 在make_unique中使用此*

2019-07-27 03:08:45  阅读:623  来源: 互联网

标签:c c11 smart-pointers unique-ptr factory-pattern


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

std::make_unique< A >(*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();
}

解决方法:

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

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

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

A(A const&);

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

由于createInstance使用clone(),因此每次调用createInstance时都会创建一个类型的“副本”.

标签:c,c11,smart-pointers,unique-ptr,factory-pattern
来源: https://codeday.me/bug/20190727/1549751.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有