假设我的标题中声明了一个对象数组。阵列的大小可能非常大。在我的源文件中,我为我的类创建了构造函数,我想初始化我的数组中的所有对象。如果没有使用零参数构造函数构造这些对象,我被告知这些需要放在我的初始化列表中。
我的问题是,如果我想使用一个循环初始化这个可能很大的对象数组,那么它不会进入初始化列表,是吗?我不想放入我的初始化列表:str1(“1”),str2(“2”),...,strn(“n”)。初始化所有这些对象的循环可以放在标题中还是可能放在构造函数的主体中?
请告诉我。我还没有看到这样的例子。
谢谢, JBU
答案 0 :(得分:6)
您无法在初始化列表中循环,但是在构造函数体中循环没有问题,只要对象类型具有有效的赋值运算符即可。首先使用零参数构造函数在构造函数体之前初始化数组中的对象。然后在身体中,您将重新分配给他们需要的任何东西。
另请注意,如果要使用相同的NON-zero参数构造函数初始化数组中的每个对象,则可以使用std :: vector类型,并在初始化列表中指定默认的非零构造函数在分配内部数组时使用,即:
// in .h
class MyClass
{
...
MyClass();
private:
vector<SomeObject> objects;
};
// in .cpp
MyClass::MyClass()
: objects(100,SomeObject(10, "somestring"))
{
}
答案 1 :(得分:5)
您必须等待C ++ 0x初始化初始化列表中的数组。
struct S {
int a[3];
S(int x, int y, int z) :a{x,y,z} { /*…*/ }; // solution to old problem
};
答案 2 :(得分:4)
可以使用boost assign来声明元素的const向量:
#include<vector>
#include<iostream>
#include<boost/foreach.hpp>
#include<boost/assign.hpp>
#include<boost/assign/list_of.hpp>
#include<boost/assign/std/vector.hpp>
using namespace std;
using namespace boost;
using namespace boost::assign;
typedef vector<int> int_vector;
const int_vector my_const_vector = list_of
(1)(2)(3)(5)(8)(13)(21)(34)(55)(89);
class myClass
{
public :
// initialization list used in the constructor
myClass(const int_vector & vec)
: m_member_vector(int_vector(vec.begin(), vec.end()))
{}
void print() const
{
BOOST_FOREACH(int i, m_member_vector)
{ cout << i << endl; }
}
private :
int_vector m_member_vector;
};
void main()
{
myClass m(my_const_vector);
m.print();
}
你可以从here获得提升。我意识到这不是阵列,但这确实解决了你的问题 - 某种方式
答案 3 :(得分:1)
您无法在初始化列表中初始化数组。你必须在构造函数的主体中完成它。
如果想要拥有数组的东西不是默认构造的,那么最简单的解决方案是使用std :: vector而不是raw数组。这样,您可以在构造函数体中添加元素时构造元素。
但是如果你坚持让一个类成员没有默认构造函数的原始数组作为类成员,那么你唯一真正的选择是使它成为一个指向Foo的指针数组而不是一个Foo数组
答案 4 :(得分:0)
不是“新手”的答案,也不是我会使用的答案,但您可以查看boost preprocessor库,它允许您使用预处理器创建循环。
答案 5 :(得分:0)
从你的问题看起来你想用不同的参数初始化数组的每个元素(如列表str1(“1”),str2(“2”),strn(“n”)所暗示的那样) )。目前的C ++无法做到这一点;正如TimW所说,C ++ 0X将允许通过序列构造器支持这种类型的初始化。
话虽如此,你想要做的似乎是这些值的运行时初始化(“1”),(“2”)......(“n”)(你在编译时知道这些值吗? ?)。如果是这种情况,我认为即使在C ++ 0X中也不能使用初始化列表。如果不是这种情况(为这个非常大的数组传递编译时参数),那么预处理器魔术就是可行的方法。