C++ ma coś, co nazywa się regułą jednej definicji. Oznacza to, że (z wyłączeniem funkcji wbudowanych) definicje mogą pojawiać się tylko w jednej jednostce kompilacji. Ponieważ pliki nagłówkowe C++ są po prostu "kopiowane i wklejane" przy każdym pliku włączającym, teraz umieszczasz definicje w wielu miejscach, jeśli umieścisz definicje w plikach nagłówkowych.
Oczywiście, możesz powiedzieć, dlaczego nie zrobić wszystkiego w linii. Jeśli kompilator przestrzega Twojej sugestii liniowej, kod dla długich funkcji zostanie zreplikowany na każdej stronie wywołania, co spowoduje, że twój kod będzie nadmiernie duży i prawdopodobnie spowoduje kłopotliwe, problemy z pamięcią podręczną i wszelkiego rodzaju niezamierzone rzeczy.
Z drugiej strony, jeśli kompilator nie słucha ciebie i niczego nie inline, teraz masz 2 problemy: 1) nie wiesz, która jednostka tłumaczeniowa ma twoje definicje klas, i 2) kompilator wciąż musi przeglądać twoje definicje za każdym razem, gdy je #include. Co więcej, nie ma łatwego sposobu, aby upewnić się, że przypadkowo nie zdefiniowałeś tej samej metody dwukrotnie, w 2 różnych nagłówkach, inaczej.
Otrzymujesz również problem z zależnością cykliczną. Aby klasa mogła wywołać metodę innej klasy, ta klasa musi zostać zadeklarowana jako pierwsza. Jeśli więc 2 klasy muszą wywoływać swoje metody, każda z nich musi zostać zadeklarowana, zanim będzie można je zdefiniować. Nie ma sposobu, aby to zrobić z deklaracjami i definicjami w jednym pliku.
Naprawdę, w ten sposób powstał język i parser. To ból, ale musisz sobie z tym poradzić.
Chciałem umieścić definicję całej klasy w .h i włączając ją, jednocześnie chroniąc ją za pomocą nagłówków –
co się stanie, jeśli włączysz ten plik .h w więcej niż jednym miejscu w tym samym pliku wykonywalnym? Ans: kończysz z wieloma definicjami tych samych funkcji. - Prawdziwym punktem jest to, że można robić różne głupstwa przy pomocy zasad, ale prawie zawsze okazuje się, że nie działają tak dobrze w praktyce jak normalne sposoby. –