Pisanie bardziej przyjazne dla refaktoryzacji C ++
W C ++ nie musisz wcale używać nagłówków. Możesz zdefiniować cały obiekt w jednym pliku, tak jak w C # lub Java. Programiści C zwykle przechowują tylko połączenia zewnętrzne w pliku nagłówkowym. Wszystkie wywołania wewnętrzne byłyby zdefiniowane w pliku .c. Tym samym tokenem możesz zarezerwować swoje pliki C ++ .h dla klas / interfejsów (czysto wirtualne klasy abstrakcyjne) / etc. które mają być udostępniane poza biblioteką DLL. W przypadku klas wewnętrznych / struktur / interfejsów itp. Wystarczy dołączyć potrzebny plik .cpp:
#include<myclass.cpp>
Nie wydaje się to być najpopularniejszym podejściem, ale jest to legalne C ++. Z pewnością byłaby to możliwość dla całego twojego wewnętrznego kodu. Pozwala to wewnętrznemu kodowi i zestawowi klas na znacznie bardziej radykalną zmianę, zapewniając jednocześnie bardziej stabilny interfejs dla kodu poza biblioteką / plikiem wykonywalnym do interakcji.
Umieszczenie całej klasy w jednym pliku ułatwi robienie tego, co chcesz. Nie rozwiąże problemu zmiany nazwy metody i konieczności przeszukiwania każdego miejsca, w którym ta metoda jest wywoływana, ale zapewni bardziej zrozumiałe komunikaty o błędach. Nie ma nic gorszego niż to, że nagłówek deklaruje metodę w jedną stronę, ale implementujesz ją inaczej. Inny kod, który wywołuje plik nagłówkowy, zostanie poprawnie skompilowany i otrzymasz wyjątek łącza, podczas gdy plik implementacyjny będzie tym, który skarży się, że metoda nie została zdefiniowana. Kiedy zdefiniujesz każdą metodę na miejscu (w rzeczywistej deklaracji klasy), otrzymasz ten sam komunikat o błędzie bez względu na to, jaki plik ją zawiera.
Możesz także przyjrzeć się temu pytaniu: Dobre narzędzia refaktoryzujące dla C ++
Jak C / C ++ rozwiązuje pliki nagłówkowe / implementacyjne
Na podstawowym poziomie C (i C ++ jest zbudowany na tej podstawie) pliki nagłówkowe deklarują obietnicę funkcji / struct / zmiennej, która wystarcza, aby kompilator mógł utworzyć plik obiektowy. Podobnie pliki nagłówkowe C ++ deklarują obietnicę funkcji, struktur, klas itp. Jest to definicja, której używa kompilator do rezerwowania miejsca na stosie itp.
Pliki .c lub .cpp mają implementację. Gdy kompilator konwertuje każdy plik implementacji na plik obiektowy, istnieją niedostosowania do niezaimplementowanych pojęć (co zadeklarowano w nagłówku). Linker łączy zaczepy z implementacjami w innych plikach obiektowych i tworzy większy plik binarny, który zawiera cały kod (biblioteka współdzielona lub plik wykonywalny).
VS Specific
Jeśli chodzi o pracę z tymi w Visual Studio, istnieją pewne kreatory, które pomagają nieco to ułatwić. Kreator nowej klasy utworzy pasującą parę plików nagłówkowych i implementacyjnych. Istnieje nawet funkcja przeglądarki klasy, która pozwoli Ci zadeklarować nowe metody. Wprowadzi definicję do nagłówka i kod źródłowy implementacji w pliku .cpp. Visual Studio ma te funkcje od ponad dekady (o ile ich używałem).