我正在做一个学校项目,但无法弄清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],它会给我预期的结果。
感谢您的帮助!
答案 0 :(得分:0)
通过引用将unique_ptr
传递给函数 不会破坏unique_ptr
,因此在此安全。
但是,通过引用传递void func(bool (*ptr)[]) const { ...
可能不是表达此想法的最佳方法。非所有者指针由C ++中的普通C风格指针表示,因此这样做是安全且惯用的:
func(uniquePtr.get());
然后
ClassName::ClassName() : unique_ptr(new bool[someSize()]) {
func(uniquePtr.get());
}
如评论中所述,数据成员应按以下方式初始化:
std::make_unique
(如果可以,请使用new
代替{{1}})