Zaprzyjaźnione klasy problem.

Zaprzyjaźnione klasy problem.
stryku
  • Rejestracja:ponad 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:607
0

Witam.
Mam takie oto diw przykładowe klasy:

A.h

Kopiuj
#ifndef A_H
#define A_H

#include "struktury.h"
#include "B.h"


class A
{
private:
	int liczba;
	B *b;

	friend class B; 
	
public:

	void funkcja()
	{
		//cos robie
	}
	
	void funkcja_2()
	{
		b->funkcja_b( this );
	}
};

#endif 

B.h

Kopiuj
 #ifndef B_h
#define B_h

#include "struktury.h"
#include "A.h"
#include <vector>

class A;

class B
{
private: 
/*...*/


public:
/*..*/
	void funkcja_b( A *a )
	{
		a->funkcja();
		int liczba = a->liczba;

	}
};


#endif

I mam problem poniewarz kompilator daje błędy typu:
1> error C2027: use of undefined type 'A'
przy: a->funkcja(); w pliku B.h w funkcji funkcja_b()

Nie bardzo wiem jak to obejść, więc zwracam się do Was z prośbą o pomoc :)

BA
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 6 lat
  • Postów:36
0

Zadeklaruj klasę A w pliku B.h przed include. Może to coś da

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 dni
0

Przynajmniej w jednej z klas (najlepiej w obu) koniecznie trzeba wynieść definicje metod operujących na obcej klasie na zewnątrz klasy do pliku .cpp.

Nie rozdzielaj programu na pliki dopóki nie nauczysz się pisać w jednym, bo teraz masz nałożone dwa problemy.
Teraz masz taki schemat:

Kopiuj
class A;
class B;

class A
  {
   public:
   void fun(B *b) { b->fun(this); }
  };

class B
  {
   public:
   void fun(A *a) { a->fun(this); }
  };

I nie ważne w jakiej kolejności umieścisz klasy A i B zawsze wewnątrz pierwszej z nich kompilator jeszcze nic nie wie o metodzie fun() wewnątrz drugiej klasy, rozwiązanie proste:

Kopiuj
class A;
class B;

class A
  {
   public:
   void fun(B *b);
  };

class B
  {
   public:
   void fun(A *a);
  };

void A::fun(B *b) { b->fun(this); }
void B::fun(A *a) { a->fun(this); }

Teraz nie ważne w jakiej kolejności zadeklarowane klasy A i B na moment ich użycia w funkcjach fun kompilator już wszystko wie.
Generalnie zastanów się nad przeprojektowania klas, bo to jest zły pomysł.

PS. przykład czysto dydaktyczny, odpalenie metody fun() powoduje przepełnienie stosu.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.