如何初始化unique_ptr

48

我正在尝试为我的类添加一种延迟初始化的函数。我对C++并不是很熟悉。能否有人告诉我如何实现它。

我的类有一个私有成员定义为:

std::unique_ptr<Animal> animal;

这是接受一个参数的原始构造函数:

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

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

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

我需要写什么来使它等同于构造函数所做的事情?


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

21
#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;
}

2
这和另一个朋友建议的使用 make_unique 是一样的吗? - dotNET
18
更好的做法可能是 this->animal = std::make_unique<A>(a); - David Schwartz
1
一样的。我只是觉得我的更糟糕。 - Menos
1
@DavidSchwartz:天啊,突然间一切都变得清晰了。感觉自己好蠢啊。混淆是因为我的参数名字叫做 file 而不是 a。Menos 的例子实际上使用的是 a。无论如何,感谢你们一直以来的支持。我现在已经转换到这种语法了。 - dotNET
删除 b; 丢失了。 - nayab
显示剩余7条评论

13

比其他变体要短得多,而且还能正常工作。谢谢! - Melebius

3
#include<iostream>
#include<memory>
#include<iostream>

class Amm{

    public:
    std::unique_ptr<double> myVar;
    explicit Amm(std::unique_ptr<double> ptr):myVar{ptr.release()}{}
};

int main(){
    Amm a(std::make_unique<double>(5));
    std::cout<<*a.myVar;

    return 0;

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接