Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: janezogre en 28 de Octubre de 2007, 11:45:18 AM

Título: duda muy curiosa
Publicado por: janezogre en 28 de Octubre de 2007, 11:45:18 AM
He decidio plantear esta duda en el foro español porque con lo extraña que es, como me la expliquen en ingles creo que no me voy a enterar. Intentaré resumir lo que me pasa pero creo que la gente va a tener que exprimirse las neuronas porque realmente es un problema muy curioso.

Resulta que tengo una clase base A(archivo AAA.h) en la cual derivan dos clases derivadas B (archivo BBB.h) y C (archivo CCC.h). Por lo tanto:

ARCHIVO AAA.h

Class myclassA {
...................
};

ARCHIVO BBB.h

#include "AAA.h"
Class myclassB:public myclassA{
public:
bool funcionB();
..................
};

ARCHIVO CCC.h

#include "AAA.h"
Class myclassC:public myclassA{
public:
bool funcionC();
...................
};

ARCHIVO MAIN.cpp

#include "BBB.h"
#include "CCC.h"

INT WINAPI WinMain(...................){
.......................
B* objetoB = new B();
....................
C* objetoC = new C();
...........................

}

Mas o menos entendido todo??? Bien pues cuando compilo me sale el error:

c:\prueba1\AAA.h(11) : error C2011: 'VariablesFuente' : 'class' type redefinition
c:\prueba1\AAA.h(11) : see declaration of 'VariablesFuente'
c:\prueba1\BBB.h(11) : error C2504: 'VariablesFuente' : base class undefined
c:\prueba1\BBB.h(11) : error C2504: 'VariablesFuente' : base class undefined

Bueno, investigué como podía solucionar esto y descubrí que C++ permite multiples declaraciones pero solo una definición, por lo tanto me puse manos a la obra aplicando #ifndef, #define, ..... Y el programa me queda como esto:

ARCHIVO AAA.h

#ifndef AAA_h
#define AAA_h

Class myclassA {
...................
};
#endif

ARCHIVO BBB.h

#ifndef BBB_h
#define BBB_h
#include "AAA.h"
Class myclassB:public myclassA{
public:
bool funcionB();
..................
};
#endif

ARCHIVO CCC.h

#ifndef CCC_h
#define CCC_h
#include "AAA.h"
Class myclassC:public myclassA{
public:
bool funcionC();
...................
};

ARCHIVO MAIN.cpp

#ifndef AAA_h
#define AAA_h
class myclassA{};
#endif
#ifndef BBB_h
#define BBB_h
#ifndef AAA_h
#define AAA_h
class myclassA{};
#endif
class myclassB : myclassA{};
#endif


//#ifndef AAA_h
//#define AAA_h
//class myclassA{};
//#endif
#ifndef CCC_h
#define CCC_h
#ifndef AAA_h
#define AAA_h
class myclassA{};
#endif
class myclassC : myclassA{};
#endif

#include "BBB.h"
#include "CCC.h"

INT WINAPI WinMain(...................){
.......................
B* objetoB = new B();
....................
C* objetoC = new C();
...........................

}

Bien, pues despues de este coñazo que os he dado, voy y compilo y me sale estos errores :
c:\prueba1\main.cpp(281) : error C2039: 'funcionB' : is not a member of 'myclassB'
c:\prueba1\main.cpp(27) : see declaration of 'myclassB'
c:\prueba1\main.cpp(285) : error C2039: 'funcionC' : is not a member of 'myclassC'
c:\prueba1\main.cpp(29) : see declaration of 'myclassC'

JA!, ¿como se te queda el cuerpo???

Por favor, necesito saber que he hecho mal o si teneis una manera más sencilla de resolverlo.

Muchas gracias de antemano.
Título: duda muy curiosa
Publicado por: shephiroth en 28 de Octubre de 2007, 03:09:49 PM
en el main.cpp te sobran los #ifdef #ifndef, incluye los 3 archivos .h y ya esta. Las otras 3 cabeceras creo q estan correctas.
Título: duda muy curiosa
Publicado por: Marci en 28 de Octubre de 2007, 03:57:33 PM
Archivo myclassA.h
============
#ifndef MYCLASSA_H
#define MYCLASSA_H
//---------------------------------------------------------------------------
class myclassA
{
   public:
       myclassA();
       ~myclassA();
   protected:
   private:
};
//---------------------------------------------------------------------------
#endif // MYCLASSA_H


Archivo myclassB.h
===========
#ifndef MYCLASSB_H
#define MYCLASSB_H
//---------------------------------------------------------------------------
#include "myclassA.h"
//---------------------------------------------------------------------------
class myclassB : public myclassA
{
   public:
       myclassB();
       ~myclassB();
   protected:
   private:
};
//---------------------------------------------------------------------------
#endif // MYCLASSB_H


Archivo myclassC.h
============
#ifndef MYCLASSC_H
#define MYCLASSC_H
//---------------------------------------------------------------------------
#include "myclassA.h"
//---------------------------------------------------------------------------
class myclassC : public myclassA
{
   public:
       myclassC();
       ~myclassC();
   protected:
   private:
};
//---------------------------------------------------------------------------
#endif // MYCLASSC_H


Archivo main.cpp
===========
#include <iostream>
//---------------------------------------------------------------------------
#include "myclassB.h"
#include "myclassC.h"
//---------------------------------------------------------------------------
using namespace std;
//---------------------------------------------------------------------------
int main()
{
   cout << "Hello world!" << endl;

   myclassB* B = new myclassB();

   myclassC* C = new myclassC();

   return 0;
}
//---------------------------------------------------------------------------


Asi debería funcionar. Un saludo