关于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
相关产品推荐
相关产品推荐

