C++ zawieranie się nawzajem klas

0

Witam.
Problem w uproszczeniu polega na tym, że mam dwie klasy - Bank i Czlowiek. Obiekt Bank zawiera tablicę klientów, czyli obiektów klasy Czlowiek. Każdy Czlowiek z kolei posiada wskaźnik na Bank, aby mógł się z tymże kontaktować. Pliki .h klas Bank i Czlowiek muszą zatem zawierać odpowiednio #include "Czlowiek.h" oraz #include "Bank.h". Sęk w tym, że kompilator wyrzuca wtedy błąd "header includes itself". Nie mam pojęcia, jak inaczej mogę rozwiązać ten problem.
Z góry dziękuję za pomoc.

0

Poleca się raczej unikać takich wiązanych klas.
W jednej z tych klas możesz zrezygnować z dołączania nagłówka drugiej klasy i zadeklarować klasę zwyczajnie poprzez forward declaration: "class Klasa;". Minus jest taki, że o ile może istnieć wskaźnik do takiej klasy, nie możesz wywoływać jej metod itd.

0

Dzięki, nie wiedziałem, że klasy też tak można deklarować.
A nie ma możliwości, aby obiekty jednej klasy mogły wywoływać metody na rzecz obiektów drugiej klasy, i na odwrót?

0

"czlowiek.h"

class Bank;
class Czlowiek {
  ...
  Bank bank;
};

"bank.h"

class Czlowiek;
class Bank{
   ...
   Czlowiek czlowiek[...];
};

nagłowki include'uj w plikach z definicjami (*.cpp).

0

i oczywiście metody możesz wywoływać spokojnie tylko, że nie w ciele klasy, a w osobnym pliku z definicjami (co jest logiczne bo w pliku z deklaracją nie istotna jest implementacja)

0

Dzięki bardzo. Spróbuję tak zrobić.

0

Trochę w tym temacie jest namieszane.
Po pierwsze w odpowiedzi na odpowiedź odp, twój sposób nie ma prawa działać. Typ każdego pola musi być w pełni zdefiniowany (nie przez "forward declaration") przed użyciem. Można to w dużym uproszczeniu zrozumieć tak, że kompilator musi wiedzieć ile pamięci ma zadeklarować przy tworzeniu klasy na wszystkie jej pola. Jeżeli nie są one zdefiniowane, kompilacja nie pójdzie dalej. Można za to spokojnie zadeklarować pole ze wskaźnikiem na inną klasę, co jest spowodowane tym, że każdy wskaźnik ma określoną wielkość.
Co do wywoływania metod. Oczywiście można je wywoływać we wszystkie strony. Należy tylko pamiętać, że przy pierwszym wywołaniu funkcji kompilator musi "wiedzieć", jaka co to jest za funkcja (czyli ta funkcja musi być zadeklarowana wcześniej). Można to np. rozwiązać przez pisanie definicji funkcji w pliku c++, z dołączonymi plikami nagłówkowymi zawierającymi deklaracje obydwu klas.

0
Zjarek napisał(a)

Można za to spokojnie zadeklarować pole ze wskaźnikiem na inną klasę
W pełni się zgadzam, mój błąd gdyż pisałem to w przeglądarce i zapomniałem o gwiazdkach. Sorry. Oczywiście to zadziała tylko ze wskaźnikiem, a samo utworzenie obiektu już należy do definicji :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1