问题 如何初始化unique_ptr


我正在尝试为我的类添加一个延迟初始化函数。我对C ++不太熟练。有人可以告诉我我是如何实现它的。

我的班级有一个私人成员定义为:

std::unique_ptr<Animal> animal;

这是带有一个参数的原始构造函数:

MyClass::MyClass(string file) :
animal(new Animal(file))
{}

我刚刚添加了一个无参数构造函数和一个Init()函数。这是我刚刚添加的Init函数:

void MyClass::Init(string file)
{
    this->animal = ???;
}

我需要写什么来使它等同于构造函数正在做什么?


5077
2017-09-17 06:46


起源

使用 std::make_unique<Animal>(file) 在成员初始化列表中。 - πάντα ῥεῖ
简单的例子: en.cppreference.com/w/cpp/memory/unique_ptr - cbinder
对于 ??? 您可以使用 std::make_unique<Animal>(file)。 - David Schwartz
@dotNet C ++是一种复杂的语言,有很多层,好的和坏的部分。如果你不熟悉C ++,你可以看看 isocpp.org/tour。它是现代C ++的C ++入门。如果您想跳过介绍,请获取Effective C ++系列的副本。 - Jens


答案:


#include <memory>
#include <algorithm>
#include <iostream>
#include <cstdio>

class A
{
public :
    int a;
    A(int a)
    {
        this->a=a;

    }
};
class B
{
public :
    std::unique_ptr<A> animal;
    void Init(int a)
    {
        this->animal=std::unique_ptr<A>(new A(a));
    }
    void show()
    {
        std::cout<<animal->a;
    }
};

int main()
{
    B *b=new B();
    b->Init(10);
    b->show();
    return 0;
}

8
2017-09-17 06:58



这跟做的一样吗 make_unique 正如另一位朋友的建议? - dotNET
可能更好 this->animal = std::make_unique<A>(a); - David Schwartz
一样的。我想,我的跛脚更加蹩脚 - Menos
@DavidSchwartz:它告诉我,当我写作时,我“试图引用已删除的函数” animal = std::make_unique<Animal>(Animal(file));。 - dotNET
@DavidSchwartz:OMG。突然之间一切都变得清晰了。感觉如此愚蠢。混淆是由我的参数命名引起的 file不是 a。 Menos的例子实际上是在使用 a。无论如何,谢谢你的支持。我现在已经切换到这个语法。 - dotNET


我觉得动物.reset(新动物(文件)) 是你想要的。


3
2017-09-17 07:00