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.