2012-07-17 10 views
8

Powiel możliwe:
In C++ why have header files and cpp files?Confused o faktycznym celu plikach nagłówka w C++

Nie dość uzyskać pliki nagłówkowe C++ dla dwóch sprzecznych powodów:

  1. Myślałem, że celem plików nagłówkowych jest generalnie oddzielenie interfejsu od implementacji. Innymi słowy, klient używa pliku nagłówkowego, aby nauczyć się korzystać z klasy, ale nie musi się martwić o to, jak klasa wewnętrznie implementuje tę funkcję.

  2. Dlaczego więc są zmienne prywatne z klasy C++ określony w pliku nagłówka?

Wydaje mi się, że posiadanie prywatnych zmiennych w pliku nagłówkowym narusza rozdział interfejsu i implementacji. Intuicyjnie uważam, że bardziej sensowne byłoby, by zmienne prywatne znajdowały się w pliku źródłowym, ponieważ jest to plik, który nie jest eksponowany na świat zewnętrzny.

Może po prostu nie rozumiem celu plików nagłówkowych, a 1. powyższe jest całkowicie błędne? W jaki sposób?

+0

Skąd wziąłeś 1. Od? – Robottinosino

+0

Oprócz funkcji 'friend', założę się, że jest to techniczne ograniczenie kompilatora do określenia rozmiaru klasy. – Mysticial

+0

@DaveSwersky Ten duplikat nie odpowiada na drugie pytanie OP: "Dlaczego zatem są to prywatne zmienne klasy C++ określone w jej pliku nagłówkowym?" – Mysticial

Odpowiedz

9

C++ rozróżnia deklaracje i definicje funkcji i klas. Ogólnie plik nagłówkowy C++ zawiera deklarację klasy. Ponieważ nie są dozwolone częściowe deklaracje, plik nagłówkowy musi zawierać pełną deklarację klasy, w tym wszystkie prywatne elementy (zmienne i funkcje składowe).

Jeśli chcesz, aby ukryć pełną realizację od publiczności można użyć pimpl idiom do osiągnięcia tego celu.

6

Podstawowym celem funkcjonalny plików nagłówkowych C++ jest to, że w języku C++ nie są moduł importu lub coś podobnego, które istnieją w innych językach. Jedynym sposobem, aby kompilator wiedział o typach, funkcjach itp. Z innych plików, jest wklejenie kodu do bieżącego pliku źródłowego przy użyciu #include.

Teoretycznie można umieścić wszystkie kodu źródłowego w nagłówku, jak również i tylko jeden plik źródłowy, który zawiera wszystkie nagłówki. Powodem, dla którego nie jest to zwykle wykonywane, jest dwojaki. Po pierwsze, kompilacja zajmie więcej czasu (poważna obawa dotycząca niektórych projektów), a każda zmiana dowolnego pliku spowoduje całkowitą rekompilację projektu. Po drugie, umieszczenie implementacji w pliku źródłowym faktycznie pomaga oddzielić interfejs od implementacji, nawet jeśli część implementacji jest nadal określona w pliku nagłówkowym.

Należy zauważyć, że metody inline w nagłówkach przechodzą również cienką linię szczegółów implementacji wystawionych publicznie/klientom klasy.

Jeśli naprawdę chcesz, aby całkowicie oddzielić interfejs od implementacji (która ma zdecydowaną zaletę) C++ sposób aby to zrobić jest wykorzystanie idiom pimpl. Używając tego idiomu wszystkie prywatne dane są ukryte w pliku źródłowym i tylko abstrakcyjny interfejs jest udostępniany publicznie. Ponadto użycie wzorca interfejsu innego niż wirtualny (NVI) może dodatkowo pomóc w odizolowaniu klientów od zmiany interfejsu.

0

w C/C++, jeden cel plikach nagłówkowych jest umożliwienie wielu jednostek tłumaczenie używać typów z samej definicji nie powielając definicji w wielu plikach.Częścią definicji klasy są jej prywatni członkowie.

3

Celem plików nagłówkowych jest nadanie kompilatorowi informacji potrzebnych do udostępniania definicji między jednostkami kompilacji (pliki źródłowe .cpp). To rzecz mechaniczna, a nie filozoficzna.

Na przykład prywatne zmienne składowe muszą zostać zadeklarowane, ponieważ definiują rozmiar obiektu, a kompilator musi znać rozmiar podczas alokowania obiektu.

+0

Czy nie byłoby poprawnym terminem do "dzielenia deklaracji" między jednostkami kompilacji? Często jest zdezorientowany, jakie są sposoby deklaracji i definicji ... –

+0

@ g-makulik, Używałem "definicji" w angielskim znaczeniu tego słowa, a nie formalnego użycia C++. Z pewnością możliwe jest dołączenie definicji do nagłówka, z szablonami, na przykład prawie obowiązkowo. –

+0

dlaczego tylko prywatne zmienne składowe? – zgulser