Domanda

Ho visto funzioni membro programmate sia all'interno della classe a cui appartengono che all'esterno della classe con un prototipo di funzione all'interno della classe. Ho mai programmato solo usando il primo metodo, ma mi chiedevo se è meglio usare l'altro o solo le preferenze personali?

È stato utile?

Soluzione

Supponendo che intendi C ++, è sempre meglio definire le funzioni outside della classe, perché se lo metti all'interno della classe, il compilatore potrebbe provare a incorporarlo, il che non è sempre desiderabile:

  1. Aumento delle dimensioni del codice (ogni file oggetto che include questa intestazione potrebbe finire con una copia della funzione nel loro codice).
  2. Rompere la compatibilità binaria quando cambia la definizione della funzione.

Anche con le funzioni incorporate, è di solito mettere le definizioni al di fuori della classe per migliorare la leggibilità dell'interfaccia pubblica della classe, a meno che la funzione non sia un banale accessorio o qualche altra linea.

Altri suggerimenti

Per C ++, inserire le definizioni dei metodi nel file di intestazione significa che tutto ciò che include una determinata intestazione deve essere ricompilato quando l'intestazione cambia, anche se è solo un dettaglio dell'implementazione.

Spostare le definizioni fuori dall'intestazione significa che i file che includono l'intestazione dovranno essere ricompilati solo quando l'intestazione stessa cambia (funzioni aggiunte / rimosse o dichiarazioni modificate). Ciò può avere un grande impatto sui tempi di compilazione per progetti complessi.

Ci sono vantaggi per entrambe le tecniche.

Se inserisci solo i prototipi nella definizione della classe, ciò rende più facile per qualcuno che sta usando la tua classe vedere quali metodi sono disponibili. Non sono distratti dai dettagli di implementazione.

Mettere il codice direttamente nella definizione della classe rende più semplice usare la classe, devi solo #includere un'intestazione. Ciò è particolarmente utile (necessario) con le classi basate su modelli.

Presumendo che la lingua sia C ++:

La linea di fondo è che è la preferenza personale. All'interno della classe è più breve nel complesso e più diretto, specialmente per

int getFoo() const { return _foo; }

tipo di funzione. Al di fuori della classe, puoi rimuovere "disordine". dalla definizione della classe.

Ho visto entrambi in uso ...

Naturalmente, le funzioni non incorporate sono sempre al di fuori della classe.

È anche comune mescolare entrambi gli stili quando si definisce una classe. Per metodi semplici costituiti da 1 o 2 righe è comune e conveniente definire il corpo del metodo all'interno della definizione della classe. Per metodi più lunghi è meglio definirli esternamente. Avrai definizioni di classe più leggibili senza ingombrarle con il corpo del metodo.

Nascondere l'implementazione di un metodo è utile in quanto l'utente della classe non sarà distratto dall'implementazione effettiva o fare ipotesi sull'implementazione che potrebbero cambiare in un secondo momento.

Presumo che tu stia parlando di C ++.

Avere un'interfaccia bella e pulita è sicuramente una buona idea. Avere un file di implementazione separato aiuta a mantenere pulita l'interfaccia.

Riduce anche i tempi di compilazione, soprattutto se si utilizza un puntatore opaco .

Se si implementa la funzione all'interno della classe, non è possibile #includere la classe in più file .cpp o il linker si lamenterà di più definizioni della funzione.

Pertanto, la prassi abituale consiste nell'avere la definizione della classe in un file .h e l'implementazione dei membri in un file .cpp (di solito con lo stesso nome).

Ancora una volta, assimilando C ++, di solito lo limito ai segnaposto su funzioni virtuali, ad esempio

virtual int MyFunc() {}  // Does nothing in base class, override if needed

Qualcos'altro, e il punto di Andrew Medico entra troppo facilmente e fa male i tempi di compilazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top