标头中宣告智慧型指标时,如何将原始资料转换成智慧型指标?

时间:2019-05-02 19:54:31

标签: c++11 pointers smart-pointers

在我们的代码中,我们主要使用原始指针,我想逐步介绍智能指针(即,不更改现有功能)。我们有一个工厂,它返回一个指向创建对象的指针。该类中的几种方法都使用此对象,因此将创建的对象的指针声明为类成员。

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转移所有权更好的方法。

1 个答案:

答案 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;
}