c++中类数组成员的初始化
Initialization of a class array member in C++
使用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
}
};
非常感谢!
带构造函数初始化列表:
B() : arrayOfA{A(1), A(2), A(3), A(4), A(5)} {}
我还建议将数组更改为std::array
。如果这不是c++ 11,恐怕你不能在没有A
的默认构造函数的情况下初始化成员。然而,仍然有可能使自己(这并不难)或使用boost::array
。在这种情况下,我不确定是否可以直接初始化数组,但它肯定是与辅助函数。
解决这个问题的一种方法是在A
中提供一个默认构造函数。
class A {
private:
int value;
public:
A() : value(0) {}
explicit A(int newNumber) {
value = newNumber;
}
};
我建议您使用默认构造函数将数组的所有值初始化为0,然后使用接受2个参数的setter函数来处理对数组的操作:
A::setVal(int val)
{
value = val;
}
B::setA(int index, int value)
{
arrayOfA[index]->setVal(value);
}
这是针对c++ 11之前不可用的非默认变量的解决方案。
只需将arrayOfA
包装在匿名联合中。这意味着构造函数和析构函数都不会被自动调用。使用placement-new/删除。(注意自动定义的特殊成员函数)
它看起来像这样:
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);
}
};
相关文章:
- 是否可以使用右值初始化数据成员?
- 扩展初始值设定项列表和未初始化的成员
- 初始化类成员的更好做法是什么?
- 使用 {} 初始化类成员
- 构造函数正在初始化数据成员
- 在类声明中初始化 const 成员变量时在调试模式下出现异常
- 初始化 const 成员的正确方法
- 初始化数据成员取决于构造函数中的条件
- 获取未初始化对象成员的地址是否定义良好?
- 为什么C++可以使用未初始化的成员变量(引用或指针 *NOT 值复制*)来初始化其父类的成员变量
- 初始化私有成员数组w/size作为类初始化参数
- 初始化类成员初始值设定项列表中的向量元组
- 在编译时使用constexpr初始化指向成员函数的指针数组
- 如何从构造函数参数初始化模板成员数组
- 初始化私有成员静态常量数组
- 在C++中,当我初始化类对象数组时,当我想通过构造函数初始化类成员时,我应该怎么做
- 如何用函数的结果初始化静态成员数组
- 是否可以动态初始化静态成员数组?
- 通过 C++ 中的构造函数初始值设定项列表初始化私有成员数组
- 是否有可能在头文件中初始化带有在构造函数中初始化的成员的私有数组?c++