Nie wiem, jak oddzielić kod implementacji i deklaracji prostej klasy do nowego nagłówka i pliku CPP. Na przykład, jak oddzielić kod dla następującej klasy?
class A2DD
{
private:
int gx;
int gy;
public:
A2DD(int x,int y)
{
gx = x;
gy = y;
}
int getSum()
{
return gx + gy;
}
};
public:
członków na górze może mieć duży wpływ , jeśli użytkownik przeniósł ich zgodnie z tą radą - ale miał zależności porządkowe między członkami i nie był jeszcze świadomy, że członkowie są inicjowani w kolejności ich deklaracji ;-)Odpowiedzi:
Deklaracja klasy trafia do pliku nagłówkowego. Ważne jest, aby dodać
#ifndef
osłony włączające, a jeśli jesteś na platformie MS, możesz również użyć#pragma once
. Pominąłem również prywatne, domyślnie członkowie klasy C ++ są prywatni.a implementacja idzie w pliku CPP:
źródło
#ifndef
rzeczy w nagłówku?Ogólnie twój .h zawiera definicję klasy, czyli wszystkie twoje dane i wszystkie deklaracje metod. Tak jak w twoim przypadku:
A następnie twój .cpp zawiera implementacje metod takich jak ta:
źródło
Należy zwrócić uwagę czytelników, którzy natkną się na to pytanie podczas szerszego badania tematu, że procedura zaakceptowanej odpowiedzi nie jest wymagana w przypadku, gdy chcesz po prostu podzielić projekt na pliki. Jest potrzebny tylko wtedy, gdy potrzebujesz wielu implementacji pojedynczych klas. Jeśli Twoja implementacja na klasę to jedna, wystarczy jeden plik nagłówkowy dla każdej.
Stąd z przykładu przyjętej odpowiedzi potrzebna jest tylko ta część:
Definicje preprocesorów #ifndef itp. Pozwalają na wielokrotne ich użycie.
PS. Temat staje się jaśniejszy, gdy zdasz sobie sprawę, że C / C ++ jest „głupi”, a #include to tylko sposób na powiedzenie „zrzuć ten tekst w tym miejscu”.
źródło
.cpp
, czy jest.h
naprawdę „dobre” tylko dla tej metody organizacji kodu?Zasadniczo zmodyfikowana składnia deklaracji / definicji funkcji:
a2dd.h
a2dd.cpp
źródło
A2DD.h
A2DD.cpp
Pomysł polega na zachowaniu wszystkich sygnatur funkcji i elementów członkowskich w pliku nagłówkowym.
Pozwoli to innym plikom projektu zobaczyć, jak wygląda klasa, bez konieczności znajomości implementacji.
Poza tym możesz następnie dołączyć inne pliki nagłówkowe do implementacji zamiast nagłówka. Jest to ważne, ponieważ niezależnie od tego, które nagłówki są zawarte w pliku nagłówkowym, zostaną uwzględnione (odziedziczone) w każdym innym pliku zawierającym plik nagłówkowy.
źródło
Pozostawiasz deklaracje w pliku nagłówkowym:
I umieść definicje w pliku implementacji.
Możesz połączyć te dwa elementy (odejdź
getSum()
na przykład definicję w nagłówku). Jest to przydatne, ponieważ daje kompilatorowi większą szansę na przykład na wstawianie. Ale oznacza to również, że zmiana implementacji (jeśli pozostawiona w nagłówku) może spowodować przebudowę wszystkich innych plików, które zawierają nagłówek.Zauważ, że w przypadku szablonów musisz zachować to wszystko w nagłówkach.
źródło
Zwykle umieszczasz tylko deklaracje i naprawdę krótkie funkcje wbudowane w pliku nagłówkowym:
Na przykład:
źródło
Nie będę odnosić się zbyt swój przykład jak to jest dość proste do ogólnej odpowiedzi (na przykład nie zawiera funkcje na matrycy, które zmuszają do ich wdrożenia w nagłówku), co śledzę jak zasada jest pimpl idiom
Ma sporo zalet, ponieważ uzyskujesz szybsze czasy kompilacji i cukier syntaktyczny:
class->member
zamiastclass.member
Jedyną wadą jest dodatkowy wskaźnik, który płacisz.
źródło