在没有默认构造函数时初始化 STL 集合元素(不是指针)

initialing stl collection elements (not pointers) when no default constructor?

本文关键字:元素 指针 集合 STL 默认 构造函数 初始化      更新时间:2023-10-16

我有这样的私人字段:

private:
    std::vector<OneItemIndex> oneItemIndexes;

我的类以这种方式声明,没有默认构造函数:

public OneItemIndex(int instrumentId)

我希望我的字段包含 10 个元素,如下所示:

oneItemIndexes
    0 OneItemIndex(0)
    1 OneItemIndex(1)
    ...
    10 OneItemIndex(10)

我该怎么做?我应该在构造函数中写什么?可能吗?

还是我必须使用OneItemIndex*而不是OneItemIndex并以这种方式称呼new OneItemIndex(instrumentId自己?

IndexesStorage::IndexesStorage(void)
{
    for (int i = 0; i < 10; i++) {
        oneItemIndexes.push_back(new OneItemIndex(i));
    }
}

注意:实际上我没有硬编码10元素,我使用的是动态Instrument::InstrumentsCount()

在 C++11 及更高版本中,您可以通过将构造函数参数传递给 emplace 函数来初始化容器元素:

oneItemIndexes.emplace_back(i);

从历史上看,您可以复制初始化它们(只要它们是可复制的;但这是 C++11 之前vector的要求(:

oneItemIndexes.push_back(OneItemIndex(i));

我不明白你问题中间向动态分配的飞跃。为什么您认为突然必须使用动态分配和存储指针?

使用

循环,但使用正常的自动存储持续时间对象。 oneItemIndexes.push_back(OneItemIndex(i))甚至oneItemIndexes.emplace(i).

您可以使用std::generate .很抱歉我的回答很简短,但我在手机上。

如果你真的不想让你的对象默认可构造和可复制,解决这个问题的最简单方法是使用 OneItemIndex 的 shared_ptrs 向量。通过这种方式,您可以从shared_ptr获得复制/初始化语义向量所需的内容,但您不需要将它们放在OneItemIndex本身上(原始指针也可以,但是您需要注意删除某处的元素(。

添加到目前为止有效的代码。我不确定这段代码有多稳定,以及使用此类黑客的安全性。为了避免调用复制构造,我必须调用reserve

IndexesStorage::IndexesStorage(void)
{
oneItemIndexes.reserve(Instrument::InstrumentsCount());
for (int i = 0; i < Instrument::InstrumentsCount(); i++) {
    oneItemIndexes.emplace_back(i);
}
}
OneItemIndex::OneItemIndex(OneItemIndex& rhs):
CustomIndex("blabla")
{
    printf("OneItemIndex copy-construct must not be called, we make it public cause MSVC++ implementation!");
    exit(0);
}