我正在研究一个学校项目,我无法弄清楚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
}
}
这不起作用,因为uniquePtr设置为全部为0,因为func()完成。我无法弄清楚如何修改uniquePtr,以便我的其他函数可以访问它。我没有尝试创建一个新的unique_ptr传递到func()然后使用move(uniquePtr),但甚至不会编译。
如果uniquePtr被函数中等化,在这种情况下将它赋值为boolean 1或0,那么该类中的函数是否可以访问?如果我在函数中打印uniquePtr [index],它会给我预期的结果。
谢谢您的帮助!
通过引用将unique_ptr
传递给函数不会破坏它,所以你在这里是安全的。
但是,通过引用传递unique_ptr
可能不是表达这个想法的最佳方式。非拥有指针由C ++中的普通C风格指针表示,因此执行此操作是安全且惯用的:
void func(bool (*ptr)[]) const { ...
然后
func(uniquePtr.get());
正如评论中所提到的,数据成员应该像这样初始化:
ClassName::ClassName() : unique_ptr(new bool[someSize()]) {
func(uniquePtr.get());
}
(如果可以,请使用std::make_unique
而不是new
)