Dev - C++ - Ayuda con cosa muy tonta

   
Vista:

Ayuda con cosa muy tonta

Publicado por Tizon (3 intervenciones) el 05/01/2015 13:38:27
Hola,

Hace años que no programo, así que lo tengo muy olvidado y me está costando lo que no está escrito, ya que eso de que no se pierde...

Así que perdón por la pregunta tonta, pero es que estoy ya desesperado y al ser algo relativamente específico no encuentro la solución por las webs.

Mi problema es el siguiente:

Estoy programando con DevC.

Creo una clase a

Después creo una clase b, que a su vez contiene un array de objetos a. Esto lo hago así porqué hay muchas más clases, no lo pongo para no complicar la pregunta. En realidad la funcionalidad del objeto b es agrupar todas las funcionalidades de manejo de los objetos a, c, d, e, etc... y tener todo el código de control en un sitio y no desparramado por todos lados.

Quedaría algo así como

class b
{
private:
a ma[10];
c mc[10];
d md[10];
...
n nd[10];
};

El caso es que necesito que la clase a, c, d... n, tengan un puntero a la clase contenedora, y que reconozca los tipos para poder acceder a las funciones. Al principio meto los includes, meto el puntero a la clase b, y parece que funcione sin problema. Ahora bien, tarde o temprano, me acaba por saltar un mensaje de que no es de un tipo reconocido.

[Error] 'b' does not name a type

Lo he probado de un montón de modos, he vuelto a crear el proyecto de 0 muchas veces, he intentado meter los includes en un orden, en otro, meter todas las clases en el mismo h, etc. Al final, no veo solución, creo que lo he probado todo y no hay manera.

Sin embargo en mis tiempos lo hacía... Tiene que ser algo muy tonto. Alguna instrucción en los Headers, o en la definición de la clase o algo así, pero no caigo y no consigo recordar.

Agradecería cualquier duda.

Muchas gracias a todos.
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
Imágen de perfil de vangodp

Ayuda con cosa muy tonta

Publicado por vangodp (287 intervenciones) el 06/01/2015 02:41:16
todo lo que se usa en C++ debe estar creado anteriormente.

si tienes 2 clases :

class A{
B *bp;
};
class B{
A a[40];
};

Si quieres crear un puntero del tipo B en A, hay que agarrar a la regla antes mencionada. Como bien puedes ver No existe B antes de A pero si existe A entes de B, Ese problema se soluciona haciendo:

class B;
class A{
B *bp;
};
class B{
A a[40];
};

...Un prototipo de clase del tipo B delante de A. Con eso tanto A ve a B como B ve a A.Ahora que se ven, tengamos otras reglas en cuenta:

Para poder asignar el puntero de B a A primero debes crear un Objeto de B con las 40 'As' dentro. Luego de eso es que ya tienes todo en la memoria, ya dispones de "punteros" para pasar, es entonces cuando debes llamar a las funciones que guardan los punteros de las 40 As(que también ya existen dentro de B) dentro de B, y pesarlas el THIS de B al constructor de cada: a[0].setPointer(this);, a[1].setPointer(this);, a[3].setPointer(this);... .

A ver si consigues.... Si tengo tiempo haré un ejemplo y después lo pongo aquí.
Recuerda:
-Si vas usar un objeto en C/C++, ese debe estar declarado antes.
-Para pasar un puntero debes haber creado un objeto de este tipo, que es cuando ocupa memoria y tiene una dirección. Las declaraciones y definiciones de una clase en si no tienen una dirección asignada hasta que tenga el objeto alocado en memoria.

Teniendo lo dicho en mente no creo que sea muy difícil hacer eso funcionar.
Intenta hacerlo y si no consigues vuelves a ver que podemos hacer.
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

Ayuda con cosa muy tonta

Publicado por Tizon (3 intervenciones) el 10/01/2015 13:23:05
Perfecto. Muchisimas gracias. Ya tengo faena para este finde.
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

Ayuda con cosa muy tonta

Publicado por Martín (65 intervenciones) el 07/01/2015 10:01:09
Si en términos genéricos se trata de crear dos o más clases que dependen unas de las otras, es lo que se llama "dependencia circular".

En este caso el compilador necesita saber que la clase aún no definida existe en algún otro lado, y se conforma con esa promesa siempre que no necesite el tipo completo de la clase faltante (que se refiere como puntero o referencia); se le informa con una "forward declaration" (declaración anticipada).

Va un ejemplo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Contenedor; // forward declaration
 
class ContenidoA
{
private:
    Contenedor* k;
};
 
 
class Contenedor
{
private:
    ContenidoA a;
};
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

Ayuda con cosa muy tonta

Publicado por Tizon (3 intervenciones) el 10/01/2015 13:24:04
Muchisimas gracias también. Ahora voy recordando. Nuevamente, gracias.
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