Oczywiście tak ściśle określona hierarchia nie występuje. Często to też zależy od znaczenia danego elementu. Czasami plik nagłówkowy jest dla klasy, a w nim dodatkowo umieszczasz mało znaczącą strukturę pomocniczą. Nie ma sensu jej umieszczać nad deklaracją klasy, bo to nie ona jest istotna. Nic jednak nie stoi na przeszkodzie, aby we własnych projektach trzymać się swojej stałej hierarchii, ale pozbawiasz się elastyczności.
Masz w rozpisce 2 razy przestrzenie nazw. Nie zgadzam się z tym, że przestrzeń powinna być za deklaracjami funkcji, bo to znaczy, że w deklaracji funkcji musiałbyś napisać, np. std::string, a później w pliku nagłówkowym już nie musisz tego std::. Trochę za bardzo namieszane. Przestrzenie nazw powinny być zaraz po dołączonych bibliotekach.
Podobnie jest z tym, że #define stoi po bibliotekach. Nie ma jednej reguły. Owszem, najczęściej właśnie tak będzie, ale weźmy prosty przykład. Biblioteka <cmath> udostępnia stałe matematyczne takie jak PI. Rzecz w tym, że aby z nich skorzystać (w Visual Studio) musisz przed dołączeniem biblioteki <cmath> umieścić makro:
#define _USE_MATH_DEFINES_
Deklarujesz chęć używania stałych w ten sposób. Zapis wygląda tak:
#define _USE_MATH_DEFINES_
#include <cmath>
// ... reszta ...
Jestem również absolutnym przeciwnikiem pisania
/** -------------------------------------------- **/
Z bardzo prostej przyczyny. Jeśli chciałbyś z jakiegoś powodu wykomentować część kodu, w której jest taki "separator kodu", to nie dasz rady tego zrobić, bo tych komentarzy nie można zagnieżdżać. Musiałbyś użyć komentarzy // i prawda, środowiska udostępniają masowe komentowanie kodu, ale to nie na tym polega, aby utrudniać sobie życie. Dobry programista znajdzie deklarację klasy bez takich liniowych przeszkadzajek.
Stosowanie się do jakichś reguł, które będziesz stosował z powodzeniem w swoich projektach jest oczywiście dobre, ale nie przywiązywałbym do tego tak wielkiej wagi. Po prostu jeśli coś jest ważniejsze to idzie na górę. Tak powinny być konstruowane pliki nagłówkowe.
Jeśli chodzi o strukturę plików nagłówkowych to na pewno należy dołączać biblioteki w jednym miejscu, przestrzenie deklarować w jednym miejscu i funkcje również. Choć na chłopski rozum. Kto w pliku nagłówkowym deklaruje klasy wraz z funkcjami globalnymi? Każda klasa powinna mieć swój własny plik nagłówkowy, a nie dzielić go z jakimiś funkcjami. Jeśli są to funkcje, które operują na obiektach danej klasy, to czemu nie zrobić je statycznymi?
Takie rozwiązanie jest w C# z całą biblioteką matematyczną. W C++ funkcje potęgujące, pierwiastkujące itd. są globalne (bo biblioteka <cmath> pochodzi z C), a w C# wszystkie są statyczne. Da się więc żyć.
Czuję, że pomimo tego wszystkiego co napisałem, to nie udzieliłem żadnej odpowiedzi. Hmm... może dlatego, że takowej nie ma. Nikt nie może wskazać jednej hierarchii. To zależy od Ciebie. Pisz aby było ładnie i wygodniej i nie utrudniaj sobie życia trzymając się ściśle własnych zasad. Jesteśmy programistami, poetami piszącymi wspaniałymi językami. Kod ma być piękny, a nie zgodny z konwencją w 100%.
Pozdrawiam.