繁体   English   中英

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;
    }
};

这是C ++ 11之前无法使用的非默认值的解决方法。

只需将您的arrayOfA包装在一个匿名联合中。 这意味着不会自动调用构造函数或析构函数。 使用新的刊登位置/删除。 (但是要注意自动定义的特殊成员功能)

它看起来像这样:

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

我建议您使用默认构造函数将数组的所有值初始化为0,然后使用一个接受2个参数的setter函数来处理数组:

A::setVal(int val)
{
    value = val;
}

B::setA(int index, int value)
{
    arrayOfA[index]->setVal(value);
}

这样的事情应该起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM