PDA

Ver la versión completa : Ayuda, definicion de clase que necesita a otra clase y esta a la anterior... :P



the_goulin
29/08/2005, 12:41
Bueno, pues estaba yo aqui con mi GpFrogger cuando me surgio un problema de esos divertidos :loco: ...

La cuestion es que tengo 2 clases y ambas se encesitan entre si, asi que la definición de ellas queda algo como asi (son 2 archivos)
#include "claseB"
class claseA
{
claseB pp;
};

#include "claseA"
clase claseB
{
claseA pp;
};

cuando compila me dice que no encuentra claseA :( por que en el momento de incluirlo aun no se ha declarado...

le a pasado a alguien?

Saludillos y gracias
The_Goulin

the_goulin
29/08/2005, 12:56
Bueno, he cambiado el sistema y ya no me hace falta... :) (si , ya se que ha sido en un par de minutos :P sorry)

pero igualmente ¿alguien sabe si es posible?


Gracias
The_Goulin

TRaFuGa
29/08/2005, 13:46
Ufff... visto así a mi me da que no, porque necesitas tener las 2 clases declaradas para poder ser usadas entre si... :S es un p**o lio xD has probao con subclases con herencia?? una vez declaradas las 2 clases (A y B), creas una subclase para clase anterior y ahi es cuando pones eso de claseA pp y claseB pp (se me acaba de ocurrir, no quiero decir que funcione ni na xDD, ademas, tampoco soy experto en C++ xDDDD)
No se, eso que te ha pasado es como decir "Para entrar necesito la llave, pero para tener la llave necesito entrar"... xDDD ais ke lio...

jjdrako
29/08/2005, 14:30
chico yo de herencias no uso xq t metes un lio bastante, si quieres q B use algo de A en A lo pones en la parte publica y los usa B perfectamente yo en uno de cartas q estoy haciendo asi lo hago y no m complico con las herencias porque creo q luego es algo asi

void NombreObjeto::FunciondeB::FunciondeA()

the_goulin
29/08/2005, 14:47
jejeej, se agradecen las respuestas ^_^ ya se que es un poco locura lo que comento, pero es que en un momento me sature programando y hice una "cruzada de punteros" (jolin parece el nombre de un farwest de esos)

^_^

igualmente no esta demas saber como lo solucionarian los demas programadores ^_^

Saludillos
The_Goulin

oankali
29/08/2005, 15:31
jejeej, se agradecen las respuestas ^_^ ya se que es un poco locura lo que comento, pero es que en un momento me sature programando y hice una "cruzada de punteros" (jolin parece el nombre de un farwest de esos)

^_^

igualmente no esta demas saber como lo solucionarian los demas programadores ^_^

Saludillos
The_Goulin

No se puede hacer lo que pides porque entrarías en una 'heréncia cíclica'.
Si analizas bien lo que pides, es que A herede de B que a su vez herede de A. Pero como que A hereda de B, entonces B heradaría de el mismo y así hasta el infinito.

Lo más probable es que tengas que crear una tercera clase C con los miembros y métodos comunes a las clases A y B. Estas dos clases heredarian de C.

Si explicas mejor lo que quieres hacer y porqué, te podré decir lo que haría yo.

Oankali.

PD: Por cierto, ¿has solucionado el problema ese de que te petaba con el emulador y no con windows?

the_goulin
29/08/2005, 15:44
No se puede hacer lo que pides porque entrarías en una 'heréncia cíclica'.
Si analizas bien lo que pides, es que A herede de B que a su vez herede de A. Pero como que A hereda de B, entonces B heradaría de el mismo y así hasta el infinito.

Lo más probable es que tengas que crear una tercera clase C con los miembros y métodos comunes a las clases A y B. Estas dos clases heredarian de C.

Si explicas mejor lo que quieres hacer y porqué, te podré decir lo que haría yo.

Oankali.

PD: Por cierto, ¿has solucionado el problema ese de que te petaba con el emulador y no con windows?


Bueno, al final lo he solucionado con una tercera clase ^_^, creo que el otro sistema que estaba usando era un poco "locura"

Lo del problema del emulador y el windows si que lo solucione ... problemas de dobles punteros, pero aun sigo sin entender pq en windows funcionaba y en la Gp no ... pq ademas hice más pruebas con dobles punteros y no tube problemas.. nu se nu se.

pero nada Oankali q el SDK con C++ va de coña ^_^ ya tengo gran parte del Frogger hecho con el y todo funciona a la perfección :brindis:

Saludillos,
The_Goulin

Conderock
29/08/2005, 17:06
Oye the_goulin ¿es que no te llegó el set corregido? :]

the_goulin
29/08/2005, 17:29
Oye the_goulin ¿es que no te llegó el set corregido? :]

si que me llego :)

pero aun no lo he puesto :P estoy un poco perro ultimamente ... esta noche lo compilo y te lo paso para tu visto bueno :)

en los proximos proyectos me lo montare mejor y pasare un sistema para que podais probar vosotros los graficos, con el GpSnake a sido un poco lioso... sorry U_U!

Saludillos,
The_Goulin

Conderock
29/08/2005, 18:27
No problem ;)

Gammenon
02/09/2005, 17:28
Saludos

Una posible solucion es esta: Tenemos esas 2 clases, cada una en su fichero. En A.h seria:



class B;

class A
{
B *patatin; // O B &patatin. Luego esto hay que inicializarlo en el constructor asi: A::A(const B &jarl) : patatin(jarl) {}
};


Luego en A.cpp tendriamos que hacer el #include "B.h".

En el fichero B.h tendriamos simplemente lo siguiente:



#include "A.h"

class B
{
A patatan; // O sino puntero o referencia
}



La cuestion es que C++ necesita la definicion de una clase (o estructura) para instanciar un objeto de la misma, pero un puntero o una referencia siempre tiene el mismo tamaño (32 bits, por ejemplo). Asi, si le dices que existe una clase llamada B, puedes declarar un puntero o una referencia a ella, y luego definirla.

Espero no haberme equivocado, y disculpad el rollo ;)

drocaborbon
02/09/2005, 20:03
Si no me falla la memoria de mis tiempos de estudiante de c++ se puede hacer una herencia de dos clases y crear una nueva..... :loco:

Gammenon
02/09/2005, 21:18
Si se puede, mediante la herencia multiple, pero the_goulin no hereda sino que agrega las clases ;)

Mergos
02/09/2005, 21:22
No. No te equivocas Gammenon.
Perdonad muchachos pero creo que os confundís. Cuando os referís a herencia, en realidad queréis decir agregación.
Esto es herencia:

class Figura
{
protected:
int color;
float pos[2]; // Posición 0:x - 1:y

public:
Figura();
...
}

class Rectangulo : public Figura
{
private:
float ancho, alto;

public:
Rectangulo();
...
}

La clase Rectángulo hereda los atributos de la clase Figura (puesto que un rectángulo es una figura), en este caso color y pos.

Si tenemos esto:
class A
{
...
}

class B
{
A pp;
...
}
es una composición o agregación: un atributo de la clase B es del tipo objeto A.

En cambio, si tenemos esto:
class B
{
A *pp;
...
}
es una asociación: un atributo de la clase B es del tipo referencia (un puntero, vamos...) al objeto A.
:sobando: :sobando: :sobando: :sobando: :sobando: :sobando:
Más rollo teórico en el libro Thinking in C++ (http://www.mindview.net/Books/TICPP/ThinkingInCPP2e.html) y en la página de Estructura de Datos II de la Universidad de Jaén (http://wwwdi.ujaen.es/asignaturas/eedd2/)
Perdonad por el post tan largo, pero he pasado mucho tiempo (demasiado :-) programando en c++ :shock:

¡Animo con el Frogger the_goulin! :brindis:

Mergos
02/09/2005, 21:26
Si se puede, mediante la herencia multiple, pero the_goulin no hereda sino que agrega las clases ;)

Vaya. Te me has adelantado... :sobando:

Gammenon
02/09/2005, 22:11
Mergos lo ha explicado mu bien, y ademas ha mentado el Thinking in C++. Recomiendo encarecidamente estos libros (son dos volumenes). El primer volumen para aprender C++ desde cero, y el segundo para las STL (aunque no se como andara esto en la GP32).

Hasta pronto :)