Zmienne prywatne są sposobem na ukrycie złożoności i szczegółów implementacji dla użytkownika klasy. Jest to dość fajna funkcja. Ale nie rozumiem, dlaczego w c ++ musimy umieścić je w nagłówku klasy. Widzę dwie irytujące wady tego:
- Zaśmieca nagłówek użytkownika
- Wymusza ponowną kompilację wszystkich bibliotek klienckich przy każdej modyfikacji elementów wewnętrznych
Czy istnieje uzasadnienie koncepcyjne tego wymogu? Czy to tylko po to, aby ułatwić pracę kompilatorowi?
struct foo{};
) jest niedozwolony, ale deklaracje forward (struct foo;
) są.Odpowiedzi:
Wynika to z faktu, że kompilator C ++ musi znać rzeczywisty rozmiar klasy, aby przydzielić odpowiednią ilość pamięci przy tworzeniu. Rozmiar obejmuje wszystkich członków, również prywatnych.
Jednym ze sposobów uniknięcia tego jest użycie idiomu Pimpl , wyjaśnionego przez Herb Suttera w jego serii Guru Tygodnia nr 24 i 28 .
Aktualizacja
Rzeczywiście, to (lub bardziej ogólnie, rozróżnienie pliku nagłówka / pliku źródłowego
#include
) jest główną przeszkodą w C ++, odziedziczonym po C. W czasach, gdyC ++C został stworzony, nie było jeszcze doświadczenia z programowaniem na dużą skalę, gdzie to zaczyna powodować prawdziwe problemy. Doświadczenia zdobyte od tego czasu były uwzględniane przez projektantów nowszych języków, ale C ++ jest związany wymogami dotyczącymi kompatybilności wstecznej, co sprawia, że naprawdę trudno jest rozwiązać tak fundamentalną kwestię w języku.źródło
private
jest bardziej nowoczesne.Definicja klasy musi być wystarczająca, aby kompilator tworzył identyczny układ w pamięci, niezależnie od tego, gdzie użyto się obiektu klasy. Na przykład biorąc pod uwagę coś takiego:
Kompilator zwykle ma
a
przesunięcie 0 ib
przesunięcie4
. Jeśli kompilator uzna to za po prostu:„Myślałby”, że
b
powinien mieć przesunięcie 0 zamiast przesunięcia 4. Gdy kod korzystający z tej definicji zostanie przypisanyb
, kod korzystający z pierwszej definicji zobaczya
modyfikację i odwrotnie.Zwykły sposób na zminimalizowanie efektów wprowadzania zmian w prywatnych częściach klasy jest zwykle nazywany idiomem pimpl (o którym jestem pewien, że Google może podać wiele informacji).
źródło
Najprawdopodobniej jest kilka powodów. Chociaż członkowie prywatni nie mogą uzyskać dostępu do większości innych klas, nadal mogą być dostępne dla klas przyjaciół. Tak więc przynajmniej w tym przypadku mogą być potrzebne w nagłówku, aby klasa znajomych mogła zobaczyć, że istnieją.
Ponowna kompilacja plików zależnych może zależeć od struktury dołączeń. Dołączenie plików .h do pliku .cpp zamiast innego nagłówka może w niektórych przypadkach zapobiec długim łańcuchom ponownej kompilacji.
źródło