Dev - C++ - Duda con vector de una clase

 
Vista:

Duda con vector de una clase

Publicado por juan carlos (4 intervenciones) el 19/12/2009 12:47:13
Lo que necesito es representar una clase que puede tener hijos o no, de su mismo tipo.
Asi se puede? pq me da error: hijos has incomplete type

class Nodo
{
int x; int y;
Nodo hijos[100];
}

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Duda con vector de una clase

Publicado por powersgame (7 intervenciones) el 20/12/2009 18:39:44
Hola.

Voy a intentar ser claro y abordar el problema con sencillez. Como no se muy bien cual es el objetivo de tu código trataré de explicar la naturaleza del error, introduciré la forma general de un modelo relacional de clases donde un objeto de una clase se puede relacionar (en un solo sentido) con varios o ningún objeto de la misma clase. Además trataré explicar, sin entrar en ninguna clase de detalles, como aplicar este modelo a una estructura de datos tipo grafo o árbol.

El error que da el compilador se debe a que se declara un atributo para la clase Nodo del mismo tipo de clase. El tipo Nodo se considera como incompleto, se podría decir que el espacio que ocupa un elemento de la clase Nodo es infinito. Cuando declaramos un objeto de la clase Nodo se llamará al constructor predeterminado de la clase y se reservará espacio para cada uno de sus atributos, pero uno de sus atributos son 100 Nodos por lo que se repetiría la acción por cada uno estos, de igual forma cada uno vuelve a estar formado por 100 Nodos... A lo que voy es que una declaración de un objeto de la clase Nodo no es un proceso de carácter cerrado, sino más bien infinito e incomputable, por tanto el tipo Nodo se dice que es incompleto.

Una clase o estructura no puede tener atributos de su mismo tipo. Sin embargo si es posible hacer que tenga atributos que sean punteros al tipo. También se puede utilizar estructuras contenedoras de alto nivel tales como listas, conjuntos, diccionarios..., que almacenen punteros o elementos del tipo ya que estos utilizan memoria dinámica.

¿cómo podemos establecer la relación uno a varios o ninguno que usted desea hacer? Pues existen varias formas, cada una de las cuales se adaptará mejor a un tipo de problema. Como no se exactamente qué es lo que desea hacer, te expongo un caso general, en el cual la relación se da en un solo sentido (dado un nodo podemos conocer sus hijos, pero no sus padres), en el que cada nodo puede estar relacionado con varios nodos o ninguno, un nodo, además, puede estar relacionado con sigo mismo y puede tener más de un padre:

#include <iostream>
#include <set>
using namespace std;
//----------------------------------------------------------------------
class Nodo {
public:
//Definimos el tipo de dato conjunto de nodos
typedef set<Nodo*> Nodos;
//Añade un nodo al conjunto de hijos
void add_nodo (Nodo& n);
//Elimina un nodo del conjunto de hijos
void del_nodo (Nodo& n);
//Devuelve el conjunto de hijos
Nodos& nodos ();
//Atributos de acceso público.
int x; int y;
private:
Nodos hijos;
};

void Nodo::add_nodo (Nodo& nodo){
hijos.insert (&nodo);
}
void Nodo::del_nodo (Nodo& nodo){
hijos.erase (&nodo);
}

Nodo::Nodos& Nodo::nodos (){
return hijos;
}
//----------------------------------------------------------------------
//Función recursiva que recorre la estructura
void Recorrido (Nodo& n){
typedef Nodo::Nodos::iterator I;
cout << n.x << endl;
for (I iter = n.nodos().begin(); iter != n.nodos().end(); ++ iter){
Recorrido (*(*iter));
}
}
//----------------------------------------------------------------------
int main(){
Nodo n;
n.x = 1;
Nodo n_1; //hijo 1 de n
n_1.x = 2;
n.add_nodo (n_1);
Nodo n_2; //hijo 2 de n
n_2.x = 3;
n.add_nodo (n_2);
Nodo n_1_1; //hijo 1 de n_1;
n_1_1.x = 4;
n_1.add_nodo (n_1_1);
Recorrido (n);
}
//----------------------------------------------------------------------

Esta implementación solo pretende ilustrar el caso práctico en c++ de relación uno a varios o ninguno entre objetos de una misma clase. Si usted lo que desea es definir estructuras de datos tales como árboles o grafos, deberá:

- Definir la clase Grafo como un conjunto de nodos o Arbol como el nodo raiz.
- Trabajar con memoria dinámica: Cada vez que se añada un nodo usariamos el operador new para reservar memoria, en vez de pasar el nodo hijo como referencia. Además deberíamos preocuparnos por la liberacion de memoria.
- Añadir las limitaciones de la estructura de datos, ya que cada estructura presenta características que las diferencian y que se han de tener encuenta a la hora de la implementación.
- Implememtar una interfaz funcional y de acceso a la estructura.

Espero ser de ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda con vector de una clase

Publicado por juan carlos (4 intervenciones) el 20/12/2009 19:10:43
Muchas gracias, te has tomado muchas molestias, me ha servido de mucho.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar