2011-12-19 24 views
13

Questa è la dichiarazione nel file di intestazione:Gli accessor dovrebbero essere in linea?

class PrimeSieve 
{ 
    populate(int lim); 
    vector<int> sieve; 
    long long limit; 

    public: 
     unsigned int limit(); 
}; 

Devo definire il metodo di accesso nel file cpp o nel .h, in linea?

Sono nuovo al C++, ma mi piacerebbe seguire le migliori pratiche. Ho visto questo in giro in alcuni dei libri - è considerato standard?

unsigned int limit() { return limit; }; 
+1

Penso che questo potrebbe probabilmente essere esteso a "dovrebbero essere allineate funzioni ragionevolmente brevi?". –

+4

Ti manca un 'const', btw. –

+0

Si noti che è possibile definire la funzione come inline, sempre nel file di intestazione, ma al di fuori del corpo della classe. Ciò a volte risulta in un'interfaccia più leggibile. Nel tuo caso, manterrai la dichiarazione della classe come "fuori linea", ma dovrai spostare la definizione della funzione nel file di intestazione, con 'inline' prima di essa. –

risposta

11

Definitivamente scrivere l'accessorio in linea nel file di intestazione. Rende possibili ottimizzazioni migliori e non riduce l'incapsulamento (dal momento che le modifiche al formato dei dati privati ​​richiedono la ricompilazione di tutte le unità che includono comunque l'intestazione).

Nel caso di un complicato algoritmo, è possibile nascondere la definizione in un file di implementazione. O quando l'implementazione richiede alcuni tipi/file header non altrimenti richiesti dalla definizione della classe. Nessuno di questi casi si applica ai semplici strumenti di accesso.

Per one-liners, inserirlo nella definizione della classe. Le funzioni membro leggermente più lunghe dovrebbero essere ancora nel file di intestazione, ma potrebbero essere dichiarate esplicitamente inline, seguendo la definizione della classe.

+1

Se ci sono un sacco di metodi inline, li inserirò anche in un file ".inl "file e stick #include" MyClass.inl "nella parte inferiore di MyClass.h in modo che il mio file di intestazione rimanga un po 'pulito (i client di MyClass non dovrebbero conoscere i dettagli di implementazione, anche i metodi inline). – franji1

7

I compilatori più recenti sono abbastanza intelligenti da allineare ciò che è necessario e lasciare tutto il resto da solo. Quindi lascia che il compilatore faccia ciò che è bravo e non provi a indovinare.

Inserisci tutto il codice in .cpp e le dichiarazioni di codice nel .h.

+0

Per "definizioni" intendi "dichiarazioni". E . . . la tua risposta non ha davvero senso per me. Se stai mettendo l'implementazione del metodo in un file .cpp, allora come si suppone che il compilatore inserisca le occorrenze in altri file .cpp? – ruakh

+1

Re: definizioni vs. dichiarazioni: Niente affatto! È una differenza molto importante in C++. Quello che chiami "codice" è in realtà "definizioni" e quelle che stai definendo "definizioni di codice" sono in realtà "dichiarazioni". Re: ottimizzazione del link-time: buono a sapersi, grazie! (PS Mi dispiace per il mio precedente commento, che ora ho cancellato, in retrospettiva penso di averlo formulato bruscamente.Vedo che ha ottenuto quattro voti "questo è un commento fantastico", quindi forse andava bene, ma ... Sì. Mi dispiace.) – ruakh

+1

@GregorBrandt: Molti compilatori utilizzati in produzione non sono all'avanguardia, mentre C++ - LTO è una tecnologia di compilazione all'avanguardia. Inoltre: sai che il supporto LTO deve essere richiesto in genere esplicitamente, o ti aspetti che il compilatore faccia tutto automaticamente per te? –

-1

Più che essere una specie di standard di programmazione globale, questi variano da organizzazioni a organizzazioni. Naturalmente, getLimit() sarebbe ancora meglio del semplice limit().

+2

'getLimit' non è uno stile C++ canonico. –

+2

Aspetta, non ti contraddicono? Dici che, come standard di codifica, varia da organizzazione a organizzazione, e quindi pretendere che 'getLimit' è meglio di' limite', nonostante il fatto che questo sia uno standard di codifica? –

+0

Ma è molto più chiaro di mere 'limit()', qualcosa è meglio di canonico, quindi meglio deve prevalere. – check123

0

Una buona regola empirica è quella di inserire tutto il codice nel file .cpp, quindi questo sarebbe contro una funzione inline nel file .h.

0

Per tipi di dati semplici in classi completamente visibili ai client della classe, non c'è alcuna differenza reale in quanto è necessario ricompilare il client ogni volta che la definizione della classe cambia.

Il motivo principale per creare una funzione di accesso anziché utilizzare direttamente il membro è consentire l'implementazione per rimuovere successivamente il membro dati e mantenere l'interfaccia compatibile; se l'interfaccia che contiene l'accessor è invariata, il risultato è tipicamente compatibile binario, altrimenti è compatibile con la fonte. Avere l'accessorio in linea significa definirlo come parte dell'interfaccia che stai modificando, in modo da poter essere sempre compatibile con la fonte.

L'altro motivo per avere un accessor è un limite DLL: se l'accessor deve chiamare in un'altra funzione e si consente che sia in linea, il simbolo di questa funzione deve essere esportato anche nel client.

A seconda della complessità del progetto, può essere utile definire un'interfaccia per il codice come una classe astratta, che consente di modificare l'implementazione a proprio piacimento senza che il cliente abbia mai visto la modifica; in questo caso, gli accessor sono definiti come astratti nella classe di interfaccia e i client non possono in linea, mai.

0

L'argomento per la dichiarazione dell'accessorio inline è che elimina la chiamata in eccesso e può consentire ulteriori ottimizzazioni.

Il mio esperto di prestazioni misurate è che il guadagno derivante da ciò è in genere piuttosto modesto. Di conseguenza non lo faccio più di default.

Problemi correlati