使用VS2012,我遇到了前所未有的问题,我的主类有一个成员,这是另一个小类的数组。这个小类有一个显式的构造函数。现在问题:如何提供初始化列表?
以下是代码:
class A { //This is the small class
private:
int value;
public:
explicit A(int newNumber) {
value = newNumber;
}
};
class B {//This is the major class
private:
A arrayOfA[5];
public:
B() {//Compiler complain "no default constructor for class A"
//But I really don't know how to supply the initialization list
}
};
非常感谢!
答案 0 :(得分:4)
使用构造函数初始化列表:
B() : arrayOfA{A(1), A(2), A(3), A(4), A(5)} {}
我还建议将数组更改为std::array
。如果这不是C ++ 11,我担心如果没有A
的默认构造函数,则无法初始化您的成员。但是,仍然有可能制作自己的(并不难)或使用boost::array
。在这种情况下,我不确定是否可以直接初始化数组,但它绝对是一个辅助函数。
答案 1 :(得分:2)
解决此问题的一种方法是在A
中提供默认构造函数。
class A {
private:
int value;
public:
A() : value(0) {}
explicit A(int newNumber) {
value = newNumber;
}
};
答案 2 :(得分:0)
这是在C ++ 11之前无法使用的非默认ctors的解决方法。
将arrayOfA
包装在一个匿名联盟中。这意味着构造函数和析构函数都不会被自动调用。使用placement-new / delete。 (谨防自动定义的特殊成员函数)
看起来像这样:
class B {//This is the major class
private:
union{A arrayOfA[5];};
public:
B() {
for(size_t i = 0; i < sizeof arrayOfA / sizeof *arrayOfA; i++)
new((void*)&arrayOfA[i]) A(i);
}
};
答案 3 :(得分:0)
我建议您使用默认构造函数将数组的所有值初始化为0,然后使用接受2个参数来处理数组的setter函数:
A::setVal(int val)
{
value = val;
}
B::setA(int index, int value)
{
arrayOfA[index]->setVal(value);
}
这样的事情应该有用。