• Viernes 8 de Noviembre de 2024, 13:02

Autor Tema:  Problemas Con Los Includes  (Leído 1467 veces)

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Problemas Con Los Includes
« en: Jueves 30 de Noviembre de 2006, 09:58 »
0
Hola

Resulta que tengo 2 archivos .h donde quiero meter 2 clases, cada clase tendra atributos o llamadas a variables de la otra clase. Se que en estos casos hay que evitar redefiniciones pero no se muy bien como aplicar los condicionales de compilacion

Esta es una simplificacion de lo que he hecho

Código: Text
  1.  
  2. #include "A.h"
  3.  
  4. #ifndef _B_H_
  5. #define _B_H_
  6.  
  7. class B  
  8. {
  9. private:
  10.   A objA;
  11. public:
  12.   B();
  13.   virtual ~B();
  14. };
  15. #endif
  16.  
  17.  

Código: Text
  1.  
  2. #include "B.h"
  3.  
  4. #ifndef _A_H_
  5. #define _A_H_
  6.  
  7. class A  
  8. {
  9. private:
  10.   B objB;
  11. public:
  12.   A();
  13.   virtual ~A();
  14. };
  15. #endif
  16.  
  17.  
  18.  

Dependiendo si pongo los includes dentro o fuera de la definicion me da 1 error u otro.

Si los pongo fuera me dice que tengo una recursion infinita
Si los pongo dentro me da error de missing storage (no reconoce los objetos de las clases incluidas)


Si alguien puede ayudarme.

Gracias y salu2

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problemas Con Los Includes
« Respuesta #1 en: Jueves 30 de Noviembre de 2006, 10:18 »
0
Creo que lo que deberias evitar es un diseño como ese. ¿No se puede plantear de otra manera? ¿Que clases son esas?

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Problemas Con Los Includes
« Respuesta #2 en: Jueves 30 de Noviembre de 2006, 10:35 »
0
Pues son estas 2 clases:

Código: Text
  1.  
  2. extern "C" class  PROYECTOSMR_API SMRcuaternio
  3. {
  4.   private:
  5.     float valores[4];
  6.   public:
  7.     //Constructores
  8.     SMRcuaternio();
  9.     SMRcuaternio(float c0,float c1,float c2,float c3);
  10.     SMRcuaternio(float ang,SMRvector eje);
  11.     SMRcuaternio(SMRpunto3D euler);
  12.     //Sobrecarga de Operadores
  13.     bool operator==(const SMRcuaternio& c);
  14.     float& operator [](int i);
  15.     SMRcuaternio operator+(const SMRcuaternio& c);
  16.     SMRcuaternio operator-(const SMRcuaternio& c);
  17.     SMRcuaternio operator*(const SMRcuaternio& c);
  18.     SMRcuaternio operator*(float escalar);
  19.     SMRcuaternio& operator = (const SMRcuaternio& c);
  20.     //Otros Metodos
  21.     SMRcuaternio GetConjugado();
  22.     float *GetValQ(){return this->valores;}
  23. };
  24.  
  25.  

Código: Text
  1.  
  2. extern "C" class  PROYECTOSMR_API SMRpunto3D
  3. {
  4.   private:
  5.     float valores[3];
  6.  
  7.   public:
  8.     SMRpunto3D();
  9.     SMRpunto3D(float v1,float v2,float v3);
  10.     SMRpunto3D operator-(const SMRpunto3D& p);
  11.     int operator*(const SMRpunto3D& p); // prod escalar
  12.     SMRpunto3D operator*(float escalar);
  13.     SMRpunto3D operator& (const SMRpunto3D &p); // prod mixto
  14.     SMRpunto3D& operator = (const SMRpunto3D& p);
  15.     float& operator [](int i);
  16.     float *GetVector(){return this->valores;}
  17.     SMRpunto3D GiraByCuaternio(SMRcuaternio c);
  18.     float GetNorma();
  19.     friend ostream& operator<<(ostream&, const SMRpunto3D&);
  20. };
  21.  
  22.  

Las lineas que instancian a las otras clases son:

En SMRcuaternio: Un constructor por un SMRpunto3D que representa los angulos rpy

En SMRpunto3D: GiraByCuaternio que gira un punto segun un cuaternio dado por parametro

Antes las tenia en un solo archivo y no tenia problemas

Si no hay solucion a ese problema quizas pueda plantearlo de otra forma si

Gracias

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problemas Con Los Includes
« Respuesta #3 en: Jueves 30 de Noviembre de 2006, 10:59 »
0
Lo que podes hacer es declarla sin definirla haciendo:

extern "C" class  SMRpunto3D;
y
extern "C" class  SMRcuaternio;

Tal vez eso te ayude ... no es lo ideal pero ... (comente algunas cosas para compilarlo).

SMRpunto3D.cpp:
Código: Text
  1.  
  2. #include "SMRpunto3D.h"
  3. #include "SMRcuaternio.h"
  4.  
  5. SMRpunto3D SMRpunto3D::GiraByCuaternio(SMRcuaternio c)
  6. {
  7.   c.GetConjugado();
  8.   return *this;
  9. }
  10.  
  11.  

SMRpunto3D.h:
Código: Text
  1.  
  2. extern "C" class  SMRcuaternio;
  3.  
  4. extern "C" class  SMRpunto3D
  5. {
  6.   private:
  7.     float valores[3];
  8.  
  9.   public:
  10.     SMRpunto3D();
  11.     SMRpunto3D(float v1,float v2,float v3);
  12.     SMRpunto3D operator-(const SMRpunto3D& p);
  13.     int operator*(const SMRpunto3D& p); // prod escalar
  14.     SMRpunto3D operator*(float escalar);
  15.     SMRpunto3D operator& (const SMRpunto3D &p); // prod mixto
  16.     SMRpunto3D& operator = (const SMRpunto3D& p);
  17.     float& operator [](int i);
  18.     float *GetVector(){return this->valores;}
  19.     SMRpunto3D GiraByCuaternio(SMRcuaternio c);
  20.     float GetNorma();
  21.     //friend ostream& operator<<(ostream&, const SMRpunto3D&);
  22. };
  23.  
  24.  

SMRcuaternio.cpp:
Código: Text
  1.  
  2. #include "SMRcuaternio.h"
  3. #include "SMRpunto3D.h"
  4.  
  5. SMRcuaternio::SMRcuaternio(SMRpunto3D euler)
  6. {
  7.   euler.GetVector();
  8. }
  9.  
  10.  

SMRcuaternio.h:
Código: Text
  1.  
  2. extern "C" class  SMRpunto3D;
  3.  
  4. extern "C" class  SMRcuaternio
  5. {
  6.   private:
  7.     float valores[4];
  8.   public:
  9.     //Constructores
  10.     SMRcuaternio();
  11.     SMRcuaternio(float c0,float c1,float c2,float c3);
  12.     SMRcuaternio(float ang, /*SMRvector*/int eje);
  13.     SMRcuaternio(SMRpunto3D euler);
  14.     //Sobrecarga de Operadores
  15.     bool operator==(const SMRcuaternio& c);
  16.     float& operator [](int i);
  17.     SMRcuaternio operator+(const SMRcuaternio& c);
  18.     SMRcuaternio operator-(const SMRcuaternio& c);
  19.     SMRcuaternio operator*(const SMRcuaternio& c);
  20.     SMRcuaternio operator*(float escalar);
  21.     SMRcuaternio& operator = (const SMRcuaternio& c);
  22.     //Otros Metodos
  23.     SMRcuaternio GetConjugado();
  24.     float *GetValQ(){return this->valores;}
  25. };
  26.  
  27.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.