make_unique 中 this* 的用法
Usage of this* in make_unique
我有一个Factory
设计模式的小例子,我对这部分很感兴趣:
std::make_unique< A >(*this)
...尤其是 *this
。
是否意味着 clone()
方法 return a std::unique_ptr
指向工厂 class 的成员?
和 createInstance()
总是 return 是 Factory
class 的同一个成员?
我只是对 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()
中,*this
是对 A
的左值引用,因此您正在从(左值引用)[=15] 构造 A
=] (在 std::make_unique
内),因此您正在使用 A
:
的隐式声明的复制构造函数
A(A const&);
因此,您实际上是在将当前对象复制到新分配的内存块中。
由于 createInstance
使用 clone()
,您每次调用 createInstance
.
时都会创建一个 type
的 "copy"
我有一个Factory
设计模式的小例子,我对这部分很感兴趣:
std::make_unique< A >(*this)
...尤其是 *this
。
是否意味着 clone()
方法 return a std::unique_ptr
指向工厂 class 的成员?
和 createInstance()
总是 return 是 Factory
class 的同一个成员?
我只是对 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()
中,*this
是对 A
的左值引用,因此您正在从(左值引用)[=15] 构造 A
=] (在 std::make_unique
内),因此您正在使用 A
:
A(A const&);
因此,您实际上是在将当前对象复制到新分配的内存块中。
由于 createInstance
使用 clone()
,您每次调用 createInstance
.
type
的 "copy"