拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何传递和存盘包含指向物件的指标的可变大小阵列?

如何传递和存盘包含指向物件的指标的可变大小阵列?

白鹭 - 2022-03-04 1974 0 0

对于我的项目,我需要ComplicatedClass在阵列中存盘指向型别物件的指标该阵列Storage与我在此处省略的其他信息一起存盘在一个类中

这是我想要做的(这显然不起作用,但希望能解释我想要实作的目标):

class ComplicatedClass
{
    ...
}


class Storage
{
    public:
        Storage(const size_t& numberOfObjects, const std::array<ComplicatedClass *, numberOfObjects>& objectArray)
            : size(numberOfObjects),
              objectArray(objectArray)
        {}

    ...

    public:
        size_t size;
        std::array<ComplicatedClass *, size> objectArray;
    
    ...
}


int main()
{
    ComplicatedClass * object1 = new ComplicatedClass(...);
    ComplicatedClass * object2 = new ComplicatedClass(...);
    Storage myStorage(2, {object1, object2});
    
    ...
    
    return 0;
}

我正在考虑的是:

  1. 使用std::vector代替std::array. 我想避免这种情况,因为我的程序的某些部分不允许在空闲存盘上分配存储器。据我所知,std::vector必须这样做。作为一个加号,我可以放弃size
  2. 更改Storage为类模板。我想避免这种情况,因为那样我的代码中到处都是模板。这并不可怕,但它会使使用的类的Storage可读性低得多,因为它们还必须具有模板化函式。

我还缺少其他任何选项吗?

uj5u.com热心网友回复:

通过动态创建物件。最方便的解决方案是使用std::vector.

这是行不通的。模板自变量必须是编译时常量。非静态成员变量不是编译时常量。

std::vector不一定需要使用免费商店。像所有标准容器(除了std::array)一样,std::vector接受一个分配器。如果您实作了一个不使用 free-store 的自定义分配器,那么您的要求就可以得到满足。

或者,即使您确实使用了默认分配器,您也可以以这样的方式撰写您的程序,即仅在程序中允许从自由存盘分配的部分中将元素插入到矢量中。

这些只是同一件事的不同词。“免费存盘”是 C 中使用的术语。它通常被非正式地称为“堆存储器”,因为“堆”是一种有时用于实作它的资料结构。

uj5u.com热心网友回复:

从 C 11 开始,std::vectordata()访问矢量用于存盘的底层阵列的方法。

在大多数情况下, astd::vector可以类似于阵列使用,允许您在需要时利用大小调整容器质量,std::vector或者在需要时将其用作阵列。https://stackoverflow.com/a/261607/1466970

最后,您知道可以使用矢量代替阵列,对吗?即使函式需要 c 样式阵列,您也可以使用矢量:

vector<char> v(50); // Ensure there's enough space
strcpy(&v[0], "prefer vectors to c arrays");
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *