我有一个包含两个类的程序(我称之为Master和Slave),Slave继承自Master。在Slave中,我定义了一个struct,以及这个struct类型的可能值数组。然后使用数组索引实例化Slave,该数组的值要从Master类填充变量。
像这样:
class Master
{
public:
std::string _a;
char _b;
int _c;
int _d;
int _e;
Master(std::string a, char b, int c, int d, int e)
: _a {a}, _b {b}, _c {c}, _d {d}, _e {e} {}
};
class Slave : public Master
{
public:
struct SlaveStruct
{
std::string a;
char b;
int c;
int d;
int e;
};
const SlaveStruct slaveArray[3]
{
{"name_a", 'A', 1, 2, 3},
{"name_b", 'B', 4, 5, 6},
{"name_c", 'C', 7, 8, 9}
};
Slave(int index) : Master {slaveArray[index].a, slaveArray[index].b,
slaveArray[index].c, slaveArray[index].d, slaveArray[index].e} {}
};
但是,当我尝试实例化它时,会发出std :: bad_alloc错误。四处乱逛,我发现它完全正常,但是如果我只是在类中声明数组,并在外面初始化它,那么:
class Slave : public Master
{
//(...)
static SlaveStruct slaveArray[3];
//(...)
};
Slave::SlaveStruct Slave::slaveArray[3]
{
{"name_a", 'A', 1, 2, 3},
{"name_b", 'B', 4, 5, 6},
{"name_c", 'C', 7, 8, 9}
};
但为什么呢?这个数组的大小是144个字节,它应该几乎不会在栈中产生影响,而我只是实例化了一次类。尝试调试它,但是在踩到Slave构造函数之后,它进入了一个C ++本机函数的深洞,这是我无法理解的,很快就会抛出bad_alloc错误。
UPDATE :根据评论中的要求,类会被实例化:
int main()
{
Slave slave {1}; // For example, any index will throw the same error.
}
平台:Windows 10,MSVC 2017。
答案 0 :(得分:2)
首先调用基类构造函数,然后构造成员。
在Master {slaveArray[index].a,...}
中,您正试图将slaveArray[index].a
传递给基类'构造函数,但此时slaveArray
尚未初始化。因此,您的程序表现出不确定的行为。
相反,静态成员在程序启动时初始化,在输入main
之前。这就是为什么你的第二个例子工作正常的原因。