2009-08-26 15 views
5

che è appropriato:definire sacco di metodi statici in C++

class xyz { 
    static int xyzOp1() { } 
    static int xyzOp2() { } 
}; 

O

namespace xyz { 
    static int xyzOp1() {} 
    static int xyzOp2() {} 
}; 

C'è qualcosa di specifico che possiamo ottenere Quando definiamo utilizza tag di classe in confronto con tag namespace?

C'è anche qualche differenza nella gestione della memoria, che dobbiamo preoccupare?

risposta

5

Senza vedere il corpo di queste funzioni, direi che gli spazi dei nomi sono più appropriati. Con gli spazi dei nomi, è possibile avere le istruzioni using, in modo che non sia necessario qualificare completamente i nomi delle funzioni durante la loro chiamata.

L'unico caso in cui utilizzare le classi è quando i metodi statici hanno qualsiasi relazione con gli oggetti della classe, ad es. quando hanno bisogno di accedere a membri privati ​​di istanze. Dalla tua descrizione, sembra che non creerai alcuna istanza di xyz, quindi non dovresti usare le classi qui.

Dal punto di vista della gestione della memoria, non vi è alcuna differenza tra questi approcci.

+0

Grazie, Stavo scrivendo alcune routine di supporto per ottenere informazioni di sistema dall'analisi/proc fs, queste routine di supporto non richiedono un'associazione con la classe, nel mio requisito ha senso utilizzare lo spazio dei nomi. Le cose potevano essere cambiate se volevo nascondere alcune di queste routine di aiuto, che altre routine di aiuto chiamano ma non esposte, in questo caso avrei potuto preferire l'approccio di classe. – harishvk27

8

Intendono cose diverse. In un contesto class, static significa che i metodi non richiedono un oggetto su cui agire, quindi sono più simili alle funzioni libere. In un contesto namespace, significa che le funzioni hanno un collegamento interno quindi sono univoci per l'unità di traduzione in cui sono definite.

Inoltre, i membri di un class sono privati ​​per impostazione predefinita così, come scritto, le funzioni di classe sono solo chiamabili l'uno dall'altro. Dovresti aggiungere un identificatore di accesso public: o rendere lo class un struct per cambiarlo.

Se sono necessarie numerose funzioni gratuite e non sono necessari oggetti classe, è probabilmente più adatto definirle come funzioni non-static in uno spazio dei nomi. Se sono definiti in linea in un file di intestazione, di solito devono essere dichiarati inline. Ciò è implicito se sono definiti in un class.

1

Il fattore principale nella scelta del metodo da utilizzare sarebbe che le funzioni stesse potrebbero voler operare su uno stato privato o utilizzare metodi privati, nel qual caso una classe statica è sicuramente l'opzione migliore.

Ci sono alcune altre sfumature, ma in definitiva una classe statica ti offrirà un maggiore controllo nel tuo incapsulamento.