c++ - 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();
}
解决方案
std::make_unique<A>(*this)
基本上相当于:
unique_ptr<A>(new A(*this))
In clone()
,*this
是对 的左值引用,因此您正在从 (lvalue-reference to) (inside )A
构造 a ,因此您使用的是 的隐式声明的复制构造函数:A
A
std::make_unique
A
A(A const&);
因此,您实际上是将当前对象的副本复制到新分配的内存块中。
由于createInstance
使用,您每次调用时都会clone()
创建一个“副本” 。type
createInstance
推荐阅读
- java - spring boot 无法使用 Intellij 连接到 MYSQL 数据库
- python - 使用空查询执行 twitter.search.tweets
- vue.js - Vue 自定义数字输入组件使用 0.01 步仅更新 int 值
- android - 如何在linphone android java代码中禁用UDP传输
- sql-server - 查询执行时间是否会因大表的不同查询参数值而异?
- c# - 示例异步任务 c#
- jquery - 如何将 json 字符串转换为 ko.observableArray([]),他们得到一个错误数据未定义?
- python - venv中的pip版本不匹配
- r - excel函数“在R中搜索决策函数
- c# - .Net Core cookie 不会被设置