在构造函数中使用 unique_ptr
Posted
技术标签:
【中文标题】在构造函数中使用 unique_ptr【英文标题】:using unique_ptr in constructor 【发布时间】:2018-08-31 11:14:03 【问题描述】:我正在做一个学校项目,但我无法弄清楚 unique_ptr 的用法。
class ClassName
private:
unique_ptr <bool[]> uniquePtr;
void func(unique_ptr<bool[]>& refPtr) const
refPtr[0] = true;
refPtr[1] = false;
public:
//other things that will use the array uniquePtr
;
ClassName::ClassName()
bool* boolName = new bool [someSize()];
uniquePtr = unique_ptr<bool[]>(boolName);
func(uniquePtr);
for(int i =0; i<someSize(); i++)
cout << uniquePtr[i];
//This is all O's
这不起作用,因为在 func() 完成时 uniquePtr 设置为全 0。我无法弄清楚如何修改 uniquePtr 以便我的其他功能可以访问它。我没有尝试创建一个新的 unique_ptr 来传递给 func() 然后使用 move(uniquePtr) 但这甚至不会编译。
如果 uniquePtr 被一个函数修改,在这种情况下将其分配为布尔值 1 或 0,那么在类中的函数之外是否应该可以访问它?如果我在函数中打印 uniquePtr[index] 它会给我预期的结果。
感谢您的帮助!
【问题讨论】:
How can I initialize C++ object member variables in the constructor?的可能重复 uniquePtr 在 func() 完成时被销毁不,不是,你为什么会这样认为? @hellow OP 应该使用 bases-members-initialiser,但这与所提出的问题无关。uniquePtr
是一个非静态成员,因此它的生命周期与ClassName
对象的生命周期相关。你有什么具体的问题让你得出“这行不通”的结论?
func
的目的是什么,为什么它必须是非静态的?为什么它必须是const
合格的?为什么需要将指向函数的指针作为参数传递?你不能像任何其他普通成员变量一样简单地使用它吗?
【参考方案1】:
unique_ptr
不会通过将其传递给函数通过引用来销毁,所以你在这里是安全的。
但是,通过引用传递unique_ptr
可能不是表达想法的最佳方式。非拥有指针在 C++ 中由普通的 C 样式指针表示,因此这样做是安全且惯用的:
void func(bool (*ptr)[]) const ...
然后
func(uniquePtr.get());
如 cmets 中所述,数据成员应该这样初始化:
ClassName::ClassName() : unique_ptr(new bool[someSize()])
func(uniquePtr.get());
(如果可以,请使用std::make_unique
而不是new
)
【讨论】:
我的意思是 uniquePtr 在 func() 完成时被删除。我认为这是因为每当我尝试访问 uniquePtr[index] 时,它都设置为 0。 @jav_solo 请就您尝试过什么提出问题并显示。如果您尝试访问uniquePtr[index]
但它不起作用,执行此操作的代码应该在问题中。问另一个问题并提供minimal reproducible example。
我已更新问题以反映我的误解。
@jav_solo 不,您应该提出 NEW 问题并提供minimal reproducible example。请仔细阅读这意味着什么。
既然你提供的是not verifiable,我投票结束这个问题。以上是关于在构造函数中使用 unique_ptr的主要内容,如果未能解决你的问题,请参考以下文章
如何在构造函数中为成员 unique_ptr 赋予默认值? [复制]
具有右值删除器的 unique_ptr 构造函数返回 null?