En C++, no es posible inicializar los miembros de la matriz en la lista de inicialización, por lo que los objetos miembros deben tener constructores predeterminados y deben inicializarse correctamente en el constructor. ¿Hay alguna solución (razonable) para esto aparte de no usar matrices?¿Alguna solución para la inicialización de matriz de miembros no estáticos?
[Cualquier cosa que pueda ser inicializado usando sólo la lista de inicialización está en nuestra aplicación mucho más preferible que mediante el constructor, como que los datos pueden ser asignados e inicializado por el compilador y enlazador, y cada número de ciclos de reloj de la CPU, incluso antes de main
. Sin embargo, no siempre es posible tener un constructor predeterminado para cada clase, y además, la reinicialización de los datos nuevamente en el constructor en lugar de eso frustra el propósito.]
P. ej. Me gustaría tener algo como esto (pero éste no funciona):
class OtherClass {
private:
int data;
public:
OtherClass(int i) : data(i) {}; // No default constructor!
};
class Foo {
private:
OtherClass inst[3]; // Array size fixed and known ahead of time.
public:
Foo(...)
: inst[0](0), inst[1](1), inst[2](2)
{};
};
La única solución que soy consciente de es la no-array uno:
class Foo {
private:
OtherClass inst0;
OtherClass inst1;
OtherClass inst2;
OtherClass *inst[3];
public:
Foo(...)
: inst0(0), inst1(1), inst2(2) {
inst[0]=&inst0;
inst[1]=&inst1;
inst[2]=&inst2;
};
};
Editar: Cabe destacar que OtherClass
no tiene un constructor predeterminado, y que es muy conveniente que el enlazador sea capaz de asignar la memoria necesaria (se crearán una o más instancias estáticas de Foo
), utilizando el montón es esencialmente verboten. He actualizado los ejemplos anteriores para resaltar el primer punto.
No olvide agregar "#include" para la ubicación nueva :) –
Drealmer
Tendré que comprobar el rendimiento de la ubicación nueva en mi plataforma, pero de lo contrario esto parece una solución de trabajo, aunque podría no ser comprensible mis colegas. :-) –
He seleccionado esta respuesta, aunque por ahora probablemente conserve mi propia versión en uso real, ya que creo que es más legible y más rápida, aunque utiliza memoria adicional para la matriz de punteros de conveniencia. –