¿Cómo inicializar un miembro de datos const char array con C ++?

Tengo una pregunta relacionada con la inicialización de miembros de la clase C ++. El siguiente código ilustra mi pregunta:

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

Los códigos anteriores funcionan muy bien, pero ahora si no configuro getByte [8] como estático, ¿cómo puedo inicializar la clase? Lo he intentado de esta manera, pero he fallado:

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

El error que he obtenido es el siguiente:

  error C2536: 'ABCD::ABCD::getByte' : cannot specify explicit initializer for arrays 

Entiendo la razón por la que recibí el error, pero no sé cómo solucionarlo. ¿Alguna idea? ¡Gracias!

En C ++ 11 puedes inicializarlo así:

 ABCD() : ObjNum(3), getByte{'a','b','c','d','e','f','g','h'} {} 

Sin embargo, si va a utilizar C ++ 11, sería mejor usar std::array como otros han sugerido en los comentarios. A continuación, podría definir la matriz como:

 const std::array getByte; 

e inicializarlo de esta manera (note las llaves dobles):

 ABCD() : ObjNum(3), getByte{{'a','b','c','d','e','f','g','h'}} {} 

En C ++ 11 puedes inicializar arrays como este:

 ABCD() : getByte { 'a','b','c','d','e','f','g','h' } { ... } 

Es mejor abandonar matrices de C. En C ++ es mejor usar std :: string. En este caso:

 class A { public: A() : s("abcdefgh") {} private: std::string s; } 

En C ++ 11 puede usar std :: array y usar std :: initializer_list

 class A public: A() : s{'a','b','c','d','e','f','g','h'} {} private: std::array<8> s; } 

En C ++ 03 puede cambiar el miembro para que sea del tipo boost :: array e inicializarlo en el constructor con una función que devuelva boost::array .

Si tienes un comstackdor compatible con C ++ 11, deberías poder usar así:

 ABCD():ObjNum(3),getByte{'a','b','c','d','e','f','g','h'} 

Pero si su comstackdor no puede manejar eso, debe inicializar la matriz manualmente en el constructor, elemento por elemento o al tener otra matriz y luego hacer, por ejemplo, memcpy .

Edición: si tu comstackdor no puede manejar la syntax de C ++ 11, estás bastante desafortunado. Sin embargo, GCC desde al menos la versión 4.4, y también VC ++ 2010, sí lo maneja. Entonces, a menos que tenga requisitos que lo obliguen a usar comstackdores “antiguos”, no debería ser un problema.