【问题标题】:using unique_ptr in constructor在构造函数中使用 unique_ptr
【发布时间】:2018-08-31 11:14:03
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

  • uniquePtr 在 func() 完成时被销毁不,不是,你为什么会这样认为?
  • @hellow OP 应该使用 bases-members-initialiser,但这与所提出的问题无关。
  • uniquePtr 是一个非静态成员,因此它的生命周期与ClassName 对象的生命周期相关。你有什么具体的问题让你得出“这行不通”的结论?
  • func 的目的是什么,为什么它必须是非静态的?为什么它必须是const 合格的?为什么需要将指向函数的指针作为参数传递?你不能像任何其他普通成员变量一样简单地使用它吗?

标签: c++11 constructor


【解决方案1】:

unique_ptr 不会通过将其传递给函数通过引用来销毁,所以你在这里是安全的。

但是,通过引用传递unique_ptr 可能不是表达想法的最佳方式。非拥有指针在 C++ 中由普通的 C 样式指针表示,因此这样做是安全且惯用的:

void func(bool (*ptr)[]) const { ...

然后

func(uniquePtr.get());

如 cmets 中所述,数据成员应该这样初始化:

ClassName::ClassName() : unique_ptr(new bool[someSize()]) {
    func(uniquePtr.get());
}

(如果可以,请使用std::make_unique 而不是new

【讨论】:

  • 我的意思是 uniquePtr 在 func() 完成时被删除。我认为这是因为每当我尝试访问 uniquePtr[index] 时,它都设置为 0。
  • @jav_solo 请就您尝​​试过什么提出问题并显示。如果您尝试访问 uniquePtr[index] 但它不起作用,执行此操作的代码应该在问题中。问另一个问题并提供minimal reproducible example
  • 我已更新问题以反映我的误解。
  • @jav_solo 不,您应该提出 NEW 问题并提供minimal reproducible example。请仔细阅读这意味着什么。
  • 既然你提供的是not verifiable,我投票结束这个问题。
猜你喜欢
  • 2016-03-18
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 2020-01-20
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 2013-03-27
相关资源
最近更新 更多