Nie ma czegoś takiego jak "klasa statyczna" w C++, więc z punktu widzenia C++ nie używasz jej "jako klasy statycznej", używasz jej "jako przestrzeni nazw". Z pewnością praktyką jest używanie przestrzeni nazw do wspólnego grupowania funkcji.
To zależy od ciebie, jak duże są grupy. Nie jest niczym niezwykłym, że biblioteki C++ używają pojedynczego obszaru nazw dla całego interfejsu publicznego. Może to zaskoczyć kogoś, kto jest przyzwyczajony do (powiedzmy) języka Java, gdzie klasy są często używane do grupowania mniejszej liczby metod statycznych. Ponieważ C++ był tutaj pierwszy, można powiedzieć, że Java używa klas jako przestrzeni nazw.
Tak więc, w C++ nie masz tendencji do oglądania klas podobnych do java.util.Collections
lub java.lang.Math
, pełnych statycznych elementów. Jeśli chcesz grupy takich funkcji w C++, użyj przestrzeni nazw.
Wyjątkiem (nie zawsze jest specjalny przypadek w C++?) Są typy cech, takie jak std::numeric_limits<T>
, gdzie parametr szablonu powoduje, że klasa robi coś, czego nie może zrobić przestrzeń nazw. Można zdefiniować obszar nazw numeric_limits
zawierający szablony funkcji max<T>()
, min<T>()
itp., Ale nie jest tak dobry. Po pierwsze, grupuje rzeczy nieco inaczej, typ T
pojawia się "w dolnej części hierarchii". Po drugie, nie robi wszystkiego, co robi typ cech, ponieważ nie ma czegoś takiego jak "szablon obiektu", który pozwoliłby ci zdefiniować wartość numeric_limits::digits<T>
.
Nie wiem, C# wystarczająco dobrze, aby wypowiedzieć się na temat praktycznych zastosowań klas statycznych tam, ale AFAIK to tylko klasa ograniczona do braku statycznych członków, więc jest to analogiczne do tych klas Java.
wolę „extern”, ponieważ tylko C++ może zrobić coś takiego w OOP;) Również w przypadku zgodności z C lub Objective C. – 9dan
* "Czy to dobrze czy dobrze ćwiczyć używanie przestrzeni nazw jako klasy statycznej" * - W rzeczywistości jest to znacznie lepsza praktyka niż twoja druga opcja. Ta ostatnia jest tylko preferowana (lub raczej potrzebna), jeśli potrzebujesz * "przestrzeni nazw szablonów" * lub chcesz, aby cały obszar nazw był przyjacielem innej klasy (choć może to być również wątpliwe). –