Mi aplicación utiliza una gran cantidad de objetos Panda
. Cada Panda
tiene una lista de objetos Bamboo
. Esta lista no cambia una vez que se inicializa Panda
(no se agregan o eliminan objetos Bamboo
). Actualmente, mi clase se lleva a cabo de la siguiente manera:Objetos de longitud variable: ¿Alguna vez una buena idea?
class Panda
{
int a;
int b;
int _bambooCount;
Bamboo* _bamboo;
Panda (int count, Bamboo* bamboo)
{
_bambooCount = count;
_bamboo = new Bamboo[count];
// ... copy bamboo into the array ...
}
}
Para aliviar la sobrecarga de la asignación de un conjunto de objetos Bamboo
, pude poner en práctica esta clase de la siguiente manera - básicamente, en lugar de crear objetos a través del constructor regular, una construcción método asigna un único bloque de memoria para contener tanto el objeto Panda
y su Bamboo
matriz:
class Panda
{
int a;
int b;
Panda()
{
// ... other initializations here ...
}
static Panda *createPanda (int count, Bamboo* bamboo)
{
byte* p = new byte[sizeof(Panda) +
sizeof(Bamboo) * count];
new (p) Panda();
Bamboo* bamboo = (Bamboo*)
p + sizeof(Panda);
// ... copy bamboo objects into the memory
// behind the object...
return (Panda*)p;
}
}
¿se puede prever algún problema con el segundo diseño, que no sea el mayor esfuerzo de mantenimiento? ¿Es este un patrón de diseño aceptable, o simplemente una optimización prematura que podría volver a morderme más tarde?
Se va a morder. Y morderá duro. –
Estás rompiendo la mayoría de la semántica para los tipos de clase en C++. Los objetos de longitud variable no existen en C++. – jalf
Si usted está interesado en los cortes de ojo-riego de esta naturaleza, también al igual que al echar un vistazo a las plantillas TBuf8 y TBuf16 clase de Symbian/C++. –