2009-06-08 32 views
24

Continuo a confondermi su questa decisione di progettazione molto spesso quando scrivo programmi, ma non sono sicuro al 100% quando dovrei fare una funzione per essere una funzione membro di una classe, quando lasciarla come una normale funzione in cui altri file sorgente possono chiamare la funzione quando la dichiarazione della funzione viene esposta in un file di intestazione. L'accesso desiderato alle variabili membro di una classe ha a che fare con la decisione la maggior parte del tempo?Funzioni membro C++ vs funzioni libere

+9

Si noti inoltre che "metodo" è un termine generale orientato agli oggetti. Il C++ non ha "metodi", solo "funzioni". Lo standard C++ non usa mai il termine "metodo". Invece, preferisci usare "funzione membro" o "funzione libera". –

+1

Il commento di Brian dovrebbe essere la risposta. Questo è ciò che la maggior parte della gente che viene qui sta cercando ... questa domanda non menziona nemmeno i metodi. –

+0

concordato. Probabilmente dovrebbe cambiare il titolo della domanda, è davvero fuorviante. – Ben

risposta

26

Il principio dell'interfaccia da Herb Sutter

Per una classe X, tutte le funzioni, comprese liberi, che sia
(a) "menzionano" X, e
(b) sono "forniti con" X
sono logicamente parte di X, perché fanno parte dell'interfaccia di X.

Per discussione approfondita lettura Namespaces and the Interface Principle da Herb Sutter.

EDIT
In realtà, se si vuole capire C++ andare a leggere tutto ciò Herb Sutter ha scritto :)

+0

Grazie per la risposta. Il collegamento è abbastanza descrittivo. – stanigator

+8

(+1). Mi piace anche questo di Scott Meyers: http://www.ddj.com/cpp/184401197. Gli articoli di Scott e Herb si completano a vicenda, penso. –

+1

Sono confuso. L'articolo collegato riguarda gli spazi dei nomi, ma la domanda non riguarda gli spazi dei nomi. Sta chiedendo quando avere "funzioni libere" contro "funzioni membro". –

0

Se qualcosa ha bisogno di accedere variabili membro o qualche aspetto di un'istanza dell'oggetto, quindi dovrebbe essere un metodo.

Se è strettamente correlato alla classe, ma non ha bisogno di accedere a qualsiasi informazione specifica dell'istanza, allora dovrebbe essere creata una funzione condivisa (o funzione di classe, o funzione statica a seconda del linguaggio di programmazione con cui si sta trattando).

Anche se è solo una funzione generica, è probabile che ne avrete più di una e che possono essere aggregate/organizzate secondo alcuni concetti. Quindi, puoi creare una classe che rappresenta quel concetto e renderli funzioni condivise.

Considerato quanto sopra, non vedo più alcun motivo per creare più funzioni autonome.

+0

C++ non ha alcun concetto di metodi. Metodo –

+4

== funzione membro – PSkocik

2

Uso le classi quando è necessario mantenere lo stato. Se una funzione non ha bisogno di accedere alle informazioni sullo stato gestito, allora preferisco una funzione libera perché rende più facile il test e il riutilizzo del codice.

Se ho una serie di funzionalità correlate ma non è necessario mantenere lo stato, quindi preferisco inserire funzioni libere in uno spazio dei nomi.