在类中初始化 unique_ptr

Posted

技术标签:

【中文标题】在类中初始化 unique_ptr【英文标题】:Initialise unique_ptr inside class 【发布时间】:2021-12-08 18:42:10 【问题描述】:

我想在声明后初始化类内的唯一指针,我尝试了几种方法但无法解决错误..

template <typename T>
struct Destroy

    void operator()(T *t) const
    
        t->destroy();
    
;

class Test

    
    std::unique_ptr<IRuntime, Destroy<IRuntime>> runtime;

public:
    Test()
    
        /*
        the function createIRuntime() return type is *IRuntime.
        I tried using following but all the ways I got error:
        1. runtime = std::make_unique<IRuntime, Destroy<IRuntime>> (createIRuntime());  
        2. runtime = createIRuntime();  
        3. runtime = std::unique_ptr<IRuntime, Destroy<IRuntime>> (createIRuntime());        
               
                 Works fine if I do follow.
                 std::unique_ptr<IRuntime, Destroy<IRuntime>> runtime(createIRuntime());
        */
        
        /* how to initialize the unique pointer here*/
    
;

【问题讨论】:

您到底遇到了什么错误? #3应该工作。另外,你试过runtime.reset(createIRuntime()) 了吗?但是,由于这是在构造函数中,您应该使用成员初始化列表:Test() : runtime(createIRuntime()) 我也尝试了重置,但它也给出了同样的错误,我可以在构造函数中使用成员初始化语法,但我也想知道在类成员方法中我应该怎么做?并且错误与指针的成员函数有关。由于指针未初始化,因此没有成员.... 术语挑剔:那些是分配,而不是初始化。这种区别在 C++ 中非常重要。 【参考方案1】:
runtime = std::make_unique<IRuntime, Destroy<IRuntime>> (createIRuntime());

推测IRuntime是一个抽象类,不能直接构造。

但即使可以按原样构造,也只有第一个模板参数指定要创建的类型。第二个和后续的模板参数指定被调用的构造函数的参数类型。

因此,该语句试图调用IRuntime 构造函数,该构造函数将Destroy&lt;IRuntime&gt; 对象作为参数,将原始IRuntime* 指针传递给该参数。不存在这样的构造函数,所以编译失败。

runtime = createIRuntime();

std::unique_ptr 没有采用原始指针的 operator=,只有 std::unique_ptrstd::unique_ptr 有一个采用原始指针的构造函数,但该构造函数被标记为 explicit。所以这也无法编译。

runtime = std::unique_ptr<IRuntime, Destroy<IRuntime>> (createIRuntime());

这是正确的,并且工作正常:

Online Demo

另一个有效的说法是:

runtime.reset(createIRuntime());

Online Demo

此外,由于您显示的代码位于另一个构造函数中,您可以(并且应该)使用该构造函数的成员初始化列表:

Test() : runtime(createIRuntime())


Online Demo

【讨论】:

以上是关于在类中初始化 unique_ptr的主要内容,如果未能解决你的问题,请参考以下文章

关于“只有静态常量整型数据成员才可以在类中初始化”

在类中初始化 QHash

在类中初始化 const

C ++在类中初始化一个空列表

在类中初始化静态结构 tm

Static在类中的作用