在构造函数中使用unique_ptr

问题描述 投票:0回答:1

我正在研究一个学校项目,我无法弄清楚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],它会给我预期的结果。

谢谢您的帮助!

c++11 constructor
1个回答
0
投票

通过引用将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

© www.soinside.com 2019 - 2024. All rights reserved.