Ver Mensaje Individual
  #2  
Antiguo 19-04-2009
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Reputación: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Hola, Negriz.

El problema de los punteros en C crea algún quebradero de cabeza a más de uno. Los punteros son una herramienta muy poderosa a la par que peligrosa para la estabilidad de un programa, de forma que es muy conveniente entenderlos bien. Si sabemos usarlos, nos proporcionarán muchas satisfacciones. Voy a tratar de resumir y explicar los aspectos más importantes para este caso particular.

1. El primer concepto a tener presente: Un puntero representa la dirección de memoria de lo que apunta, y el tipo del puntero es el tipo del objeto o variable apuntada.

2. Podemos tener punteros a cualquier cosa, incluidos punteros a punteros.

3. Un array, se representa por un puntero al primer elemento, y podemos tener arrays de cualquier cosa y representarlo por un puntero.

4. Podemos aplicar la aritmética de punteros. Si sumamos un entero a un puntero, obtenemos un puntero al siguiente elemento del array que representa ese puntero. La resta funciona igual. La aritmética es sensible al tipo de puntero, como es lógico.

5. El índice de un array aplicado al puntero devuelve el elemento indexado. Con la aritmética de punteros, la suma del indice al puntero, es un puntero a ese elemento indexado, pero no el propio elemento, que será el valor del puntero. De esta manera esto es cierto: vector[i] == *(vector+i)

En tu caso, para definir un array de TCheckBox, tienes que tener en cuenta que un objeto de ese tipo es realmente un puntero, por eso lo tienes que crear con el operador new. Es decir, no tienes un objeto sino en realidad un puntero a dicho objeto. Para crear un array de cualquier objeto de las clases VCL, lo que en realidad necesitas es un array de punteros de dicho tipo.

Si int i es un entero, int *pi = &i es un puntero a un entero que es i. int **ppi = pi es un puntero a un puntero entero.

Si TCheckBox *test es un puntero a un TCheckBox, TCheckBox **Arraytest es un puntero a un puntero de tipo TCheckBox, o lo que es lo mismo, puede estar representando un array de punteros TCheckBox, que es lo que tu quieres. Ahora sólo tienes que reservar la memoria necesaria para el array de punteros y para esos punteros.

Dejémomos de royos y vamos al grano:

Código:
   // Crear el Array de TCheckBox
   int Count = 10;
   // reservo espacio para 10 punteros del tipo TCheckBox*
   TCheckBox **ArrayCB = new TCheckBox*[Count];

   // Creo los elementos del array y damos los valores necesarios...
   for(int i=0; i<Count; i++){
      ArrayCB[i] = new TCheckBox(this);
      ArrayCB[i]->Left = 5;
      ArrayCB[i]->Top = 25+(25*i);
      ArrayCB[i]->Caption = "TCheckBox " + IntToStr(i);
      InsertControl(ArrayCB[i]);
   }
Y, por supuesto, en algún momento habrá que destruirlo:

Código:
   // Destruir el Array
   // Destruyo los elementos
   for(int i=0; i<Count; i++){
      delete ArrayCB[i];
   }

   // Destruyo el Array de punteros
   delete [] ArrayCB;
Espero haber sido claro y poco aburrido.

Saludos.

PD. No te comenté que std::vector es un template que crea clases para dar funcionalidad a arrays. En el fondo es lo mismo que te esplique, pero con la facilidad de que una clase se encarga del trabajo de crear el array, reservar memoria, destruir, redimensionar el array.... Antes de usar esta facilidad conviene entender los fundamentos.

Última edición por escafandra fecha: 19-04-2009 a las 02:05:19.
Responder Con Cita