如何初始化一个unique_ptr
Posted
技术标签:
【中文标题】如何初始化一个unique_ptr【英文标题】:How to initialize a unique_ptr 【发布时间】:2015-09-17 06:46:47 【问题描述】:我正在尝试向我的班级添加延迟初始化函数。我对C++不是很精通。谁能告诉我我是如何实现的。
我的班级有一个私有成员定义为:
std::unique_ptr<Animal> animal;
这是带有一个参数的原始构造函数:
MyClass::MyClass(string file) :
animal(new Animal(file))
我刚刚添加了一个无参数构造函数和一个 Init() 函数。这是我刚刚添加的 Init 函数:
void MyClass::Init(string file)
this->animal = ???;
我需要在那里写什么才能使它等同于构造函数正在做的事情?
【问题讨论】:
在成员初始化列表中使用std::make_unique<Animal>(file)
。
简单例子:en.cppreference.com/w/cpp/memory/unique_ptr
对于???
,您可以使用std::make_unique<Animal>(file)
。
@dotNet C++ 是一种复杂的语言,它有很多层,有好有坏。如果你不是很精通 C++,你可以看看isocpp.org/tour。它是现代 C++ 的 C++ 介绍。如果您想跳过介绍,请获取 Effective C++ 系列的副本。
【参考方案1】:
#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;
【讨论】:
这和其他朋友建议的make_unique
一样吗?
更好的可能是this->animal = std::make_unique<A>(a);
是一样的。我认为我的更蹩脚
@DavidSchwartz:当我写 animal = std::make_unique<Animal>(Animal(file));
时,它告诉我“试图引用已删除的函数”。
@DavidSchwartz:天啊。一下子,一切都变得清晰起来。感觉好笨混淆是由于我的参数被命名为file
,而不是a
。 Menos 示例实际上使用了a
。不管怎样,谢谢你对我的包容。我现在已经切换到这种语法了。【参考方案2】:
我认为animal.reset(new Animal(file))
是你想要的。
http://en.cppreference.com/w/cpp/memory/unique_ptr/reset
【讨论】:
比其他变体短得多并且可以工作。谢谢!【参考方案3】:#include<iostream>
#include<memory>
#include<iostream>
class Amm
public:
std::unique_ptr<double> myVar;
explicit Amm(std::unique_ptr<double> ptr):myVarptr.release()
;
int main()
Amm a(std::make_unique<double>(5));
std::cout<<*a.myVar;
return 0;
【讨论】:
以上是关于如何初始化一个unique_ptr的主要内容,如果未能解决你的问题,请参考以下文章