You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于std::make_unique<A>(*this)在工厂模式中的用法疑问

关于Factory模式示例代码的疑问解答

先把你的代码格式化得更易读(补充了必要的头文件,确保能正常编译):

#include <iostream>
#include <memory>
#include <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. std::make_unique<A>(*this) 里的 *this 到底起什么作用?

你可能误以为这里调用的是你写的 A(std::string name) 构造函数,但实际上不是!当你传递 *this(当前A对象的引用)给 make_unique<A> 时,编译器会调用A的拷贝构造函数——因为你没有显式定义拷贝构造,C++编译器会自动为你生成一个默认的拷贝构造,它会把当前对象的所有成员变量(比如这里的name_)逐位复制到新创建的A对象里。

简单说,这行代码的作用是:创建当前A对象的一个副本,然后用std::unique_ptr管理这个新副本的内存。

2. clone()方法返回的std::unique_ptr是否指向Factory类的成员?

完全不是。clone()里的std::make_unique<A>(*this)会在堆上新建一个A对象(是Factory中type成员的拷贝),返回的unique_ptr指向的是这个全新的对象,和Factory的type成员是两个独立的实例,各自有自己的内存空间。

3. createInstance()是否总是返回Factory类的同一个成员?

也不是。每次调用createInstance(),都会触发type->clone(),而clone()每次都会生成一个新的A对象副本。所以每次调用createInstance()返回的unique_ptr都指向不同的对象——只不过这些新对象的name_值都是"MyName",因为都是从Factory的type成员拷贝而来的。

额外补充:显式定义拷贝构造让行为更清晰

如果你想让代码的意图更明确,可以显式定义A的拷贝构造函数,这样就能直观看到拷贝的逻辑:

class A: public Base { 
    std::string name_; 
public: 
    A(std::string name) : name_(name) {}; 
    // 显式拷贝构造
    A(const A& other) : name_(other.name_) {}

    // 其他代码不变...
};

这样就完全明确了clone()是在创建当前对象的拷贝。

内容的提问来源于stack exchange,提问作者user8024280

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:39:40