在我们的代码中,我们主要使用原始指针,我想逐步介绍智能指针(即不更改现有功能(。我们有一个工厂将指针返回到创建的对象。同类中的几种方法使用此对象,因此将创建对象的指针声明为类成员。
std::unique_ptr<IObject> object;
现在,我想用智能指针替换原始指针。
我发现我可以将原始指针传递给智能指针的构造函数(在我的情况下,我认为unique_ptr是正确的(,但是由于标题中声明了智能指针,所以这是行不通的。我尝试使用
object = make_unique<IObject>(CreateObject(1));
,但这给出了汇编错误,因为IObject是抽象的。我唯一能找到的解决方案是创建一个临时唯一_ptr,然后使用移动。
//Factory.h
std::unique_ptr<IObject> object;
//Factory.cpp
IObject* ObjectFactory::CreateObject(int type)
{
switch( type )
{
case 1:
return new A();
case 2:
return new B();
}
}
//My solution is:
object = std::move( std::unique_ptr<IObject>(ObjectFactory::CreateObject(1)) );
我想知道是否有比创建临时智能指针然后使用移动转移所有权的方法更好的方法。
您可以使用唯一指针的reset
成员函数将Iobject
对象类型设置为从工厂的原始指针。
//Factory.h
std::unique_ptr<IObject> object;
//Factory.cpp
IObject* ObjectFactory::CreateObject(int type)
{
switch( type )
{
case 1:
return new A();
case 2:
return new B();
}
}
//use reset
object.reset(ObjectFactory::CreateObject(1));
这是一个最小的工作示例。
#include <iostream>
#include <memory>
class Abs {
public:
virtual ~Abs() = 0;
};
Abs::~Abs(){ std::cout << "calledn"; }
class A: public Abs {};
class B: public Abs {};
Abs* Factory(int type)
{
switch(type)
{
case 1:
new A();
break;
case 2:
new B();
break;
}
}
int main()
{
std::unique_ptr<Abs> obj;
obj.reset(Factory(1));
return 0;
}