Non esiste una "classe statica" in C++, quindi da un punto di vista C++ non la si utilizza "come una classe statica", la si utilizza "come spazio dei nomi". È certamente prassi comune utilizzare gli spazi dei nomi per raggruppare le funzioni.
Spetta a te, però, quanto grande vuoi che siano i gruppi. Non è insolito che le librerie C++ utilizzino un singolo spazio dei nomi per l'intera interfaccia pubblica. Ciò potrebbe essere una sorpresa per qualcuno che è abituato a (diciamo) Java, dove le classi sono spesso utilizzate per raggruppare insieme un minor numero di metodi statici. Dato che C++ è stato qui per primo, si potrebbe dire che Java sta usando le classi come spazi dei nomi.
Quindi, in C++ non si tende a vedere classi simili a java.util.Collections
o java.lang.Math
, pieno di membri statici. Se vuoi gruppi di funzioni come quella in C++, usa gli spazi dei nomi.
L'eccezione (non c'è sempre un caso speciale in C++?) È tipi di tratti come std::numeric_limits<T>
, in cui il parametro del modello fa fare alla classe qualcosa che un namespace non può fare. È possibile definire uno spazio dei nomi numeric_limits
contenente i modelli di funzione max<T>()
, min<T>()
ecc., Ma non è altrettanto valido. In primo luogo, raggruppa le cose in modo leggermente diverso, il tipo T
appare "in basso nella gerarchia". In secondo luogo, non fa tutto ciò che fa un tipo di carattere, perché non esiste un "modello di oggetto" che ti consente di definire un valore numeric_limits::digits<T>
.
Non conosco C# abbastanza bene da commentare gli usi pratici delle classi statiche, ma AFAIK è solo una classe limitata a non avere membri non statici, quindi è analoga a quelle classi Java.
fonte
2013-01-16 15:11:59
preferisco "extern" perché solo C++ può fare questo in OOP;) Anche per C o compatibilità con Objective C. – 9dan
* "Va bene o va bene esercitarsi a usare uno spazio dei nomi come una classe statica" * - In effetti è di gran lunga una pratica migliore della seconda opzione. Quest'ultimo è solo preferito (o meglio necessario) se hai bisogno di uno "spazio dei nomi template" * o vuoi rendere un intero spazio dei nomi un amico di un'altra classe (anche se potrebbe essere discutibile). –