duda sobre sintaxis c++

astinus de palanthas
03 de Abril del 2006
hola a todos

estoy aprendiendo c++ y bueno creo que controlo más o menos bien, pero el caso es que a veces veo unas cosas en los ficheros .h que no entiendo muy bien. cosas del tipo

#sección de includes....

y luego cosas del tipo

class clase1;
class clase2;
class clase3;


esto de arriba es mi duda, esas declaraciones class, no he encontrado ninguna referencia a ellas en la bibliografía que estoy usando y me gustaría saber si alguien me puede ayudar

muchas gracias de antemano


[email protected]
03 de Abril del 2006
Hola., hay una cosa muy importante, normalmente la gente piensa que programar es traducir de un lenguaje a otro, en este caso no es así. En C o en pascal se programa de una forma, pero actualmente no se programa así, se programa con una tecnología o paradigma se llama "Programacion orientada a Objetos", pues eso de "class" es mucho más complicado de lo que te pudiera esplicar, debes de mirar "Programacion basada en objetos, orientada a objetos..." y es larguito asi que paciencia.

En cuanto a lo de los includes es básico. Muy antiguamente y con lenguajes de juguete, como el pascal y cosas de esas, todo el compilador cabia en memoria, ahora no es así, se programa por modulos con lo que todo lo que uses debes de decirselo al compilador, por ejemplo, si quieres calcular la raiz cuadrada de un numero debes de incluir la libreria que la contenga, en este caso se pondria #include "math.h"

Espero haberte ayudado ;-) un saludo

Matasuegras
03 de Abril del 2006
Hola Astinus,

vamos a ver. Tal y como planteas el supuesto porograma, falta algo. Si es lo que yo supongo, debe haber una declaración de clase que haga uso de clase1, clase2 y clase3 más tarde. Si es así, a lo que te refieres es lo que en c++ se llama una declaración avanzada de clase. Por ejemplo:

#include ...
...

class Huevo; // Declaración avanzada de Huevo
class Gallina; // Declaración avanzada de Gallina

class Gallina {
char nombre[256]; // Nombre de la gallina
Huevo* huevo1, huevo2; // Puntero a un par de huevos que puso la gallina
}

class Huevo {
Gallina* gallina; // Puntero a la gallina que nace de un objeto de la clase Huevo
}

Bien, este programa no podría compilarse si no se ponen las declaraciones avanzadas de las clases Huevo y Gallina. ¿Por qué? Muy sencillo. La clase Huevo tiene en su interior miembros de la clase Gallina (punteros a Gallina), y por su parte la clase Gallina tiene miembros de la clase huevo (punteros también).

El parser del lenguaje C++ es completamente secuencial. Mientras se está definiendo una clase, todos las clases de los miembros que se definen en ella deben haber sido definidos anteriormente. Si embargo esto no es posible en clases que tienen definiciones mutuamente recursivas, como el caso que te he presentado, ya que una de las dos clases debe definirse primero.

La forma de resolverlo es como te he planteado. Se añade una declaración de la clase indicando su nombre y nada más (ésto es lo que se conoce como declaración avanzada de la clase). Más tarde se hará uso de ésta definición avanzada en el cuerpo de la declaración que quiera hacer uso de ella.

Es una práctica muy habitual en clases que definen estructuras de datos que tienen definiciones recursivas como las listas enlazadas (nodos que apuntan a otros nodos), árboles (nodos que apuntan a un árbol izquierdo y a un árbol derecho que a su vez es un nodo que tiene dos subárboles, ...).

No sé si van por ahí los tiros. Espero haberte respondido.

Saludos.