2016-04-06 62 views
5

Mam projekt C++, który zaczyna być duży. Mam do czynienia z sytuacją, w której mam wiele klas z kołowymi zależnościami. Załóżmy, że mam klasy A, B, C, D. Aby rozwiązać ten problem, Utworzyłem plik nagłówkowy o nazwie circular_dep.hC++ tworzy nagłówek do rozwiązania zależności cyklicznej dobrym pomysłem?

zawartość tego pliku byłby wskaźniki do klas:

class A; 
class B; 
class C; 
class D; 

ten nagłówek jest teraz zawarty we wszystkich nagłówkach moich klas. W ten sposób kompilator przestał narzekać, gdy miałem cykliczne zależności. Ilekroć dodaję nową klasę do projektu, będę musiał dodać ją do circular_dep.h

Nie mogłem znaleźć prostszego sposobu na zrobienie tego, więc dla mnie jest to najlepsze rozwiązanie, więc daleko. Moje pytanie brzmi: czy warto stosować się do projektów, które mogą napotkać problemy z zależnościami cyklicznymi? A może to zły projekt/zły lub niebezpieczny zwyczaj?

+0

referencje tarczowe są najlepiej unikać wszystkich razem. Lepiej może zapytać, jak zmienić strukturę kodu, tak aby nie były one potrzebne w pierwszej kolejności. Zauważ, że plik nagłówkowy, który wyświetlasz, nie zawiera * wskaźników *, ale (do przodu) * deklaracji * klas. – 5gon12eder

+3

Moim preferencją byłoby po prostu mieć indywidualne odwołania do klasy w nagłówkach, które ich potrzebują. Ale to tylko preferencja. Jednym z powodów, dla których nie należy umieszczać wszystkiego w jednym nagłówku, jest zapobieganie ponownej kompilacji wszystkiego po dodaniu klasy. –

+0

W mojej głowie niektóre przypadki mogą być nieuniknione. Na przykład piszę kompilator dla prostego języka, który wygląda jak C. Funkcja ma blok (wszystko pomiędzy "{" i "}"). blok ma deklaracje i polecenia zmiennych (np. "jeśli"), a polecenie może mieć blok ("jeśli" może mieć blok). W związku z tym mamy kwestię circ dep między Command i Block – Aleksandrus

Odpowiedz

2

To, co masz, jest w porządku. Sufiks nazywania, który zwykle widziałem, to: _fwd.h/_fwd.hpp/ lub jakikolwiek wariant, który lubisz. Możesz to zobaczyć w Boost, na przykład: optional_fwd.hpp.

(Oczywiście zmniejszenie wzajemnie od siebie zależnych jest dobrym celem, ale niektóre rzeczy są wzajemnie rekurencyjne w przyrodzie, jak gramatyk, więc nie masz wyboru.)