2009-06-15 8 views
14

Jestem nowym do C++, więc to pytanie może być podstawowy:dwóch klas, które odnoszą się do siebie

mam dwie klasy, które muszą odnosić się do siebie. Każdy jest w osobnym pliku nagłówkowym, a # include jest plikiem nagłówkowym drugiego. Kiedy próbuję skompilować, pojawia się błąd "ISO C++ zabrania deklarowania" Foo "bez typu" dla jednej z klas. Jeśli przełączam rzeczy, aby pierwszy nagłówek został najpierw przeanalizowany, otrzymam ten sam błąd w drugiej klasie.

Czy w C++ istnieją dwie klasy, które wymagają wzajemnego odniesienia?

Aby uzyskać więcej szczegółów: Mam klasę "App" i "Window". Aplikacja musi odwoływać się do okna, aby utworzyć okno. Okno ma przycisk, który oddzwania do aplikacji, więc potrzebuje odniesienia do aplikacji. Jeśli nie mogę mieć dwóch klas odwoływać się do siebie, czy istnieje lepszy sposób na wdrożenie tego?

+2

Należy zauważyć, że w miarę możliwości należy unikać wzajemnych zależności. Czy ma sens faktoring funkcjonalności wywoływanej przez przyciski w aplikacji na osobny obiekt kontrolny? –

+0

Ten problem występuje dość często w moich małych grach. Mam obiekt World zawierający obiekty Game, które muszą odwoływać się do obiektu World dla np. Wykrywanie kolizji. Nie znalazłem dobrego sposobu, aby to zmienić. (A tak przy okazji, budząc 7-letnią dyskusję, żeby zdobyć mi jakąś odznakę) – Johan

Odpowiedz

27

Możesz użyć deklaracji forward w plikach nagłówkowych, aby ominąć zależności cykliczne, o ile nie masz zależności implementacyjnych w nagłówkach. W Window.h, dodaj linię:

class App; 

W App.h, dodać linię:

class Window; 

Dodaj te linie przed definicjami klas.

Następnie w plikach źródłowych można dołączyć nagłówki rzeczywistych definicji klas.

Jeśli definicje klas odnoszą się do członków innej klasy (na przykład w liniach wewnętrznych), to muszą zostać przeniesione do pliku źródłowego (nie są już wstawiane).

8

Deklaracja terminowa jest drogą do zrobienia.

Jeśli używasz wskaźników \ ​​reference w nagłówku klasy, to funkcja Forward declaration po obu stronach będzie działała dla ciebie.

Jeśli tworzysz obiekt jako element członkowski klasy, musisz dołączyć sam nagłówek. (Deklaracja forward nie zadziała, ponieważ kompilator potrzebuje definicji klasy, aby poznać rozmiar).

Refer C++ FAQ for solving such senario:

Jeśli tworzysz okno, jak członka następnie zawierać nagłówek okna w aplikacji, ale w tym samym oknie czasowym nie powinny zawierać nagłówek aplikacji. Użyj kombinacji wskaźnika do aplikacji i deklaracji do przodu.

Powiązane problemy