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

时间:2014-04-23 11:43:44

标签: c++ stl

我有这样的私人领域:

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()

5 个答案:

答案 0 :(得分:1)

我不了解问题中间动态分配的飞跃。为什么你认为你突然不得不使用动态分配和存储指针?

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

答案 1 :(得分:1)

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

oneItemIndexes.emplace_back(i);

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

oneItemIndexes.push_back(OneItemIndex(i));

答案 2 :(得分:0)

您可以使用std::generate。很抱歉,我的回答很简洁,但我正在打电话。

答案 3 :(得分:0)

如果你真的不想让你的对象默认可构造和可复制,解决这个问题的最简单方法是使用shared_ptrs向量到OneItemIndex。这样你就可以从shared_ptr获得copy / initialize语义向量,但是你不需要在OneItemIndex本身上使用它们(原始指针也可以工作,但是你需要在某处删除元素)。

答案 4 :(得分:0)

添加到目前为止有用的代码。我不确定这段代码有多稳定以及使用这些黑客的安全性如何。为了避免调用copy-construct,我必须调用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);
}