我有一个与C ++类成员初始化有关的问题。以下代码说明了我的问题:
class ABCD
{
public:
ABCD():ObjNum(3){};
~ABCD() {};
static const unsigned char getByte[8];
const int ObjNum;
};
const unsigned char ABCD::getByte[8] = {
'a','b','c','d','e','f','g','h'
};
int main()
{
ABCD test;
cout<<test.getByte[3]<<endl;
return 0;
}
上面的代码工作得很好,但是现在如果我没有将getByte [8]设置为静态,我怎么能初始化类?我试过这种方式,但失败了:
class ABCD
{
public:
ABCD():ObjNum(3),getByte('a','b','c','d','e','f','g','h')
{
};
~ABCD() {};
const unsigned char getByte[8];
const int ObjNum;
};
int main()
{
ABCD test;
cout<<test.getByte[3]<<endl;
return 0;
}
我获得的错误如下:
error C2536: 'ABCD::ABCD::getByte' : cannot specify explicit initializer for arrays
我理解错误的原因,但我不知道如何修复它。任何的想法?谢谢!
答案 0 :(得分:4)
在C ++ 11中,您可以像这样初始化它:
ABCD() : ObjNum(3), getByte{'a','b','c','d','e','f','g','h'} {}
但是,如果您打算使用C ++ 11,最好使用其他人在评论中建议的std::array
。然后,您可以将数组定义为:
const std::array<unsigned char, 8> getByte;
并以这种方式初始化它(注意双括号):
ABCD() : ObjNum(3), getByte{{'a','b','c','d','e','f','g','h'}} {}
答案 1 :(得分:3)
在C ++ 11中,您可以像这样初始化数组:
ABCD() : getByte { 'a','b','c','d','e','f','g','h' }
{ ... }
答案 2 :(得分:1)
如果你有一个C ++ 11兼容的编译器,你应该能够这样使用:
ABCD():ObjNum(3),getByte{'a','b','c','d','e','f','g','h'}
但是如果你的编译器无法处理,你必须在构造函数中手动初始化数组,逐个元素或通过另一个数组然后执行以下操作: memcpy
。击>
编辑:如果您的编译器无法处理C ++ 11语法,那么您将非常幸运。但是,GCC至少从4.4版开始,还有VC ++ 2010,它确实可以处理它。因此,除非您有强制要求使用“古代”编译器的要求,否则它应该不是问题。
答案 3 :(得分:1)
最好放弃C数组。在C ++中,最好使用std :: string。在这种情况下:
class A
{
public:
A() : s("abcdefgh") {}
private:
std::string s;
}
在C ++ 11中,您可以使用std :: array并使用std :: initializer_list
class A
public:
A() : s{'a','b','c','d','e','f','g','h'} {}
private:
std::array<8> s;
}
答案 4 :(得分:1)
在C ++ 03中,您可以将成员更改为boost::array类型,并使用返回boost::array<char,8>
的函数在构造函数中初始化它。