我在初始化这个课时遇到了问题:
class Table{
public:
long r;
long c;
int g;
int q;
std::vector<std::vector<long> > data;
//Helper Methods
Table(){r=-1;c=-1;g=-1; q=-1;data.clear();};
double rate(void) const {...};
bool check(void) const {...};
void q_auto(void){q = r / g;};
};
如果我尝试这个:
static Table my_table = {16200, 10800, 360, 30, {{1,3},{2,5}}};
它完全失败了:
error: could not convert ‘{16200, 10800, 360, 30, {{1, 3}, {2, 5}}}’ from ‘<brace-enclosed initializer list>’ to ‘Table’
我有C ++ 11。那么,那里有什么问题?我尝试了额外的括号,但没有运气......我正在使用g ++。
该课不应该是手写的,但我知道这些数值是正确的,只是想把这个表作为全局值。没有任何额外的内部调用来获取最终的表值。
答案 0 :(得分:8)
只有在未声明用户定义的构造函数时,才能使用struct成员的Brace初始化。由于Table
具有用户定义的默认构造函数,因此不允许直接初始化成员(以防止用户代码构造类的实例而不运行构造函数)。
顺便提一下,在函数定义之后不需要分号。
编辑:结合iammilind的建议,支持成员默认初始化为-1以及大括号初始化的好方法如下:
class Table{
public:
long r = -1;
long c = -1;
int g = -1;
int q = -1;
std::vector<std::vector<long> > data;
double rate(void) const {...}
bool check(void) const {...}
void q_auto(void){q = r / g;}
};
这依赖于C ++ 11对类成员初始化器的支持,而C ++ 14支持使用成员初始化器对类进行大括号初始化。