在构造函数中使用unique_ptr

时间:2018-08-31 11:14:04

标签: c++11 constructor

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

感谢您的帮助!

1 个答案:

答案 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}})