c++中类数组成员的初始化

Initialization of a class array member in C++

本文关键字:初始化 组成员 数组 c++      更新时间:2023-10-16

使用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);
    }
};