Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





duda muy curiosa

Iniciado por janezogre, 28 de Octubre de 2007, 11:45:18 AM

« anterior - próximo »

janezogre

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.

shephiroth

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.

Marci

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






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.