在header中声明智能指针时,如何将原始指针转换为智能指针?

How to convert raw to smart pointer when smart pointer is declared in header?

在我们的代码中,我们主要使用原始指针,我想逐步介绍智能指针(即不改变现有功能)。我们有一个工厂 returns 指向已创建 object 的指针。 class 中的几个方法使用此 object,因此指向创建的 object 的指针被声明为 class 成员。

std::unique_ptr<IObject> object;

现在,我想用智能指针替换原始指针。

我发现我可以将原始指针传递给智能指针的构造函数(在我的例子中我认为 unique_ptr 是正确的)但是因为智能指针是在 header 这是行不通的。 我尝试使用

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

您可以使用 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;
}