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ę
Wymiana metod między klasami
- Rejestracja: dni
- Ostatnio: dni
- Rejestracja: dni
- Ostatnio: dni
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ąć?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1620
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.
- Rejestracja: dni
- Ostatnio: dni
Czyli stosowanie takiego sposobu jest raczej niemile widziane w c++ i należy się tego wystrzegać.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1620
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.
- Rejestracja: dni
- Ostatnio: dni
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 :)
- Rejestracja: dni
- Ostatnio: dni
Dziękuje bardzo za wypowiedzi bardzo pomocne dla mnie i zapewne dla innych którzy pierwszy raz napotkają ten problem
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1340
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
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Warszawa
- Postów: 1454
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.
- Rejestracja: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
MasterBLB napisał(a):
#pragma once - ale to działa tylko zdaje się w Visual Studio
Działa praktycznie wszędzie.