C++11 在构造函数中使用unique_ptr

C++11 在构造函数中使用unique_ptr,c++11,constructor,C++11,Constructor,我正在做一个学校的项目,我不知道它的独特用法 class ClassName { private: unique_ptr <bool[]> uniquePtr; void func(unique_ptr<bool[]>& refPtr) const { refPtr[0] = true; refPtr[1] = false; } public: //oth

我正在做一个学校的项目,我不知道它的独特用法

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,以便我的其他功能可以访问它。我没有尝试过创建一个新的唯一的\u ptr来传递到func中,然后使用moveuniquePtr,但这甚至不会编译

如果uniquePtr被一个函数修改,在这种情况下,将其赋值为布尔值1或0,那么类中该函数之外的函数不应该访问它吗?如果我在函数中打印uniquePtr[index],它会给出预期的结果

谢谢你的帮助

通过引用将唯一的\u 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如果可以

uniquePtr的可能副本在func完成时被销毁了不,为什么你会这么认为?@hellow OP应该使用bases members initialiser,但这与所问的问题无关。uniquePtr是一个非静态成员,因此,它的生存期连接到ClassName对象的生存期。您有什么具体的问题使您得出这样的结论:func不起作用?func的目的是什么?为什么它必须是非静态的?为什么它必须是const合格的?为什么需要将指向函数的指针作为参数传递?你不能简单地像其他普通成员变量一样使用它吗?我的意思是当func完成时,uniquePtr被删除。我之所以这样认为是因为每当我尝试访问uniquePtr[index]时,它都被设置为0。@jav_solo请问一个问题,并展示一下你的尝试。如果您试图访问uniquePtr[index]但它不起作用,那么执行该操作的代码应该是有问题的。再问一个问题并提供答案。我已经更新了这个问题以反映我的误解。@jav_solo不,你应该问一个新问题并提供答案。请仔细阅读这意味着什么。因为你提供的是我投票结束这个问题。