Problema con #includes

Iniciado por <<<-Basura->>>, 4 Junio 2013, 06:35 AM

0 Miembros y 1 Visitante están viendo este tema.

amchacon

#10
Vale lo he estado probado y tienes razón.

El problema es el orden de la cabeceras, ambas clases se complementan pero al incluirse forman un bucle recursivo.

He conseguido compilar lo siguiente:

A.hpp

Código (cpp) [Seleccionar]
#ifndef A_H
#define A_H

class A
{
   public:
       A(int);
   protected:
   private:
       int num;
       B* Algo;
};

#endif // A_H


A.cpp

Código (cpp) [Seleccionar]
#include "B.h"
#include "A.h"

A::A(int n)
{
   num = n;
   Algo = new B;
}


B.hpp
Código (cpp) [Seleccionar]
#ifndef B_H
#define B_H
class A;

class B
{
   public:
       B();
   protected:
   private:
       int tonteria;
       A* retornoA();
};

#endif // B_H


B.cpp
Código (cpp) [Seleccionar]
#include "B.h"
#include "A.h"

B::B()
{
   tonteria = 2;
}

A* B::retornoA(){
A *a = new A(10);
return a;
}


Main.cpp

Código (cpp) [Seleccionar]
#include <iostream>
#include "B.h"
#include "A.h"
using namespace std;

int main()
{
   cout << "Hello world!" << endl;
   return 0;
}


Hay otro método que proponen aquí:
http://www.daniweb.com/software-development/cpp/threads/20494/c-beginner-include-recursion-problem
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

<<<-Basura->>>

Gracias por toda la ayuda que me brindastes ya lo he solucionado!!.

Basándome en lo ultimo que publicaste, se que hay que separar todo en *.hpp y *cpp pero no lo he hecho así ya que llega tornarse enorme para buscar un problema, también la solución que me brindaste no es la que andaba buscando. la de en el main tener que incluir las dos librerías:

Código (cpp) [Seleccionar]

#include "B.h"    // Esto es lo que estaba evitando
#include "A.h"    // Esto es lo que estaba evitando

int main(){
    return 0;
}


Y esta es la solución:

A.hpp:
Código (cpp) [Seleccionar]

#include "B.hpp"

#ifndef _A_
#define _A_

class A{
private:
B* b;
public:
A(int);
A(B*);
};

A::A(int algo){
b = new B(algo);
}

A::A(B *pB){
b = pB;
}

#endif


B.hpp:
Código (cpp) [Seleccionar]

#ifndef _B_
#define _B_

class A;

class B{
private:
int dato;
public:
B(int);
A* retornoA();
};

B::B(int algo){
dato = algo;
}

#include "A.hpp"
A* B::retornoA(){
A *a = new A(10);
return a;
}

#endif


Y en el main incluyo solo a A.hpp
Código (cpp) [Seleccionar]

#include "A.hpp"

int main(){
return 0;
}


amchacon muchas gracias por ayudarme, fuiste de muy gran ayuda, de toda la gente que ayudo(nadie mas), espero que mi solución te sea de feedback,
Grafcias
<<<--Basura-->>>