我有这样的私人领域:
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()
答案 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);
}