在我们的代码中,我们主要使用原始指针,我想逐步介绍智能指针(即,不更改现有功能)。我们有一个工厂,它返回一个指向创建对象的指针。该类中的几种方法都使用此对象,因此将创建的对象的指针声明为类成员。
std::unique_ptr<IObject> object;
现在,我想用智能指针替换原始指针。
我发现我可以将原始指针传递给智能指针的构造函数(在我的情况下,我认为unique_ptr是正确的),但是由于智能指针在标头中声明,因此无法正常工作。 我尝试使用
object = make_unique<IObject>(CreateObject(1));
但这会产生编译错误,因为IObject是抽象的。 我唯一能找到的解决方案是创建一个临时的unique_ptr,然后使用move。
//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)) );
我想知道是否有比创建临时智能指针然后使用move转移所有权更好的方法。
答案 0 :(得分:0)
您可以使用唯一指针的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 << "called\n"; }
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;
}