【问题标题】:Populating Array of Pointers in Function在函数中填充指针数组
【发布时间】:2017-11-07 17:49:25
【问题描述】:

我有一个带有指针数组的类,它在构造函数中动态分配。这个类还有一个填充数组的函数。

HolderClass::HolderClass(int number)
{
  arrayOfPointers = new ItemClass*[number];
}

HolderClass::addItem(int number, ItemClass item)
{
  arrayofPointers[number] = &item;
}

即使这会编译,我的理解是否正确,因为 item 变量的生命周期仅在 addItem 函数的持续时间内,我实际上会用悬空指针填充数组?

用指向传入项的指针填充 arrayOfPointers 的正确方法是什么?这里的一个复杂性是 ItemClass 的子类将被传递给 addItem 函数,所以我不相信可以使用默认的复制构造函数。

编辑:此代码适用于 Arduino,因此我在可以做什么和不可以做什么方面受到相当的限制。这也意味着我想为这个类的用户保留一些东西(因为有很多 Arduino 新手),而不要求他们传递指向 addItem 函数的指针(这将要求他们管理传递的生命周期在 ItemClass 对象中)。

【问题讨论】:

    标签: c++ arrays pointers inheritance arduino


    【解决方案1】:

    用指向传入项的指针填充 arrayOfPointers 的正确方法是什么?

    首先,不要使用原始的newdelete。使用容器和智能指针。

    struct HolderClass
    {
        std::unique_ptr<std::unique_ptr<ItemClass>[]> arrayOfPointers;
        // ...
    };
    
    HolderClass::HolderClass(int number)
    {
         arrayOfPointers = std::make_unique<std::unique_ptr<ItemClass>[]>(number);
    }
    

    然后,传递指向addItem 的指针而不是值以避免对象切片和生命周期问题:

    HolderClass::addItem(int number, std::unique_ptr<ItemClass> item)
    {
        arrayofPointers[number] = std::move(item);
    }
    

    【讨论】:

    • “使用容器和智能指针。”那为什么不使用std::vector呢?
    • 默认矢量在 Arduino 上也不可用。您可以通过第三方库访问它,但如果我不需要减小代码大小,我宁愿不走那条路。
    • 为了更贴合OP的设计。
    • 不幸的是,Arduino 上通常没有 std 的任何内容,所以我需要一个更基本的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2021-09-19
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多