Witam, mam problem z wykorzystaniem metody napisanej w klasie A chcę ją wykorzystać w klasie B. Otóż jeśli w klasie B w pliku nagłówkowym dam #include "A.h" to potem już w klasie A nie mogę dać #include "B.h" zaznaczam że dopiero się uczę
No to teraz kolejne pytanie. Czy coś takiego jest dobrą praktyką, czy powinno się tego unikać, czy to jest niedopuszczalne mimo że można to ominąć?
Same z siebie deklaracje wyprzedzające nie są złe. Natomiast często zwiastują zły (bo zamotany — a zamotany, bo trudno go zrozumieć liniowo, w oderwaniu od większej całości) kod.
Czyli stosowanie takiego sposobu jest raczej niemile widziane w c++ i należy się tego wystrzegać.
Nie byłbym tak radykalny (chociaż znam ludzi, którzy są). Wg mnie to tylko oznaka tego, że dobrze jest dać ten kod komuś do obejrzenia, może da się łatwiej/ładniej/czytelniej. Ale może się nie dać i wtedy używaj śmiało.
Jesli zachodzi taka zaleznosc, to prawdopodobnie architektura aplikacje jest zła jak powiedział @Althorion . Najczesciej stosowanym i najlatwiejszym rozwiazaniem wydaje sie wydzielenie 3 klasy ktora to spina :)
Dziękuje bardzo za wypowiedzi bardzo pomocne dla mnie i zapewne dla innych którzy pierwszy raz napotkają ten problem
Forward declaration
jest przydatne i może przyspieszyć kompilację, bo załączony header, może zawierać inne headery, które zawierają inne headery itd. A deklaracja to deklaracja - przeczyta, zapamięta i idzie dalej :P
Sposób na krzyżowe inkludowanie (plik1.h includuje plik2.h, a plik2.h includuje plik1.h) to dyrektywy preprocesora:
#pragma once - ale to działa tylko zdaje się w Visual Studio
tzw. declaration guard polegający na tym, że w plikach h masz:
#ifndef UNIKALNA_NAZWA_H, przeważnie się stosuje nazwę pliku zapisaną wielkimi literami, w tym przykładzie byłoby to PLIK1_H
#define UNIKALNA_NAZWA_H a konkretnie PLIK1_H
tu idzie zwykła zawartość pliku .h, czyli jakieś deklaracji klas, funkcji, zmiennych itd.
#endif //i na koniec zamknięcie strażnika.
dzięki strażnikowi wszystko, co jest zamknięte w dyrektrywach #ifndef / #endif wystąpi przy includowaniu tylko raz.
Dla mnie za mało kontekstu.
Ale ogólnie jestli klasa A zależy od B, a klasa B zależy od A, to najczęściej znaczy, że coś jest nie tak i to niezależnie od języka programowania.
Jedyny wyjątek od tej reguły jest wtedy jeśli jedna z tych klas jest używana tylko i wyłącznie przez tą drugą (np jak się implementuję listę).
Wszelkie cykliczne zależności w kodzie (które są widoczne na zewnątrz klasy), zwykle prowadzą do problemów.
MasterBLB napisał(a):
#pragma once - ale to działa tylko zdaje się w Visual Studio
Działa praktycznie wszędzie.