2009-11-25 14 views
5

Durante la revisione di una delle nostre classi C++ tramite coverity, ha mostrato un messaggio di errore su una particolare classe. La classe è la seguente:Identificatore di classe utilizzato all'interno della dichiarazione della classe. È una buona pratica?

class InputRecord 
{ 
    /* Construtor */ 
    ... 
    InputRecord::RejectRecord(); 
    ... 
    /* Destructor */ 
} 

Qual è il significato dell'utilizzo di un identificatore all'interno della classe? È una buona pratica seguire questo?

Grazie, Mathew Liju

risposta

5

Sui compilatori gcc (v4.1 e successivi) questo non riuscirebbe a compilare con "errore: qualifica aggiuntiva". È quindi buona norma non metterlo lì!

Vedere here che discute la qualifica aggiuntiva come non legale C++.

+0

non solo gcc, qualsiasi compilatore ad eccezione di Visual Studio. –

0

G'day,

Ho sempre pensato che tipo di identificatore è stato utilizzato solo per l'attuazione e non era necessaria nella definizione della classe.

una dichiarazione di classe è

class InputRecord; 

Quello che hai c'è una definizione di classe.

class InputRecord 
{ 
    /* Construtor */ 
    ... 
    RejectRecord(); 
    ... 
    /* Destructor */ 
} 

poi nel file cpp si ha la realizzazione

InputRecord::RejectRecord() 
{ 
    ... 
} 
+0

Anche questa è la mia comprensione. Prima di prendere qualsiasi decisione sul cambiamento del programma, voglio solo confermare la mia comprensione. Comunque grazie per la risposta :-) –

0

In generale, non ci sono casi in cui la disambiguazione fornito dal esplicito InputRecord:: nel codice di esempio sono suscettibili di essere qualsiasi cosa diverso da ridondante.

Se il codice sta eseguendo manipolazioni complesse in cui la classe specifica è rilevante (ad esempio lo si sta trasmettendo a una classe base con una versione ombreggiata), può essere utile semplificare il codice per renderlo esplicito.

È un po 'come usare this-> (o this. in C#/Java).

Personalmente rimuoverei tali specificatori ridondanti e troverei un altro modo per ottenere il punto.

+0

In realtà penso che sia C++ che Java dovrebbero forzare le persone a usarlo per le variabili membro, quindi non dobbiamo nominarli mValore, m_valore, m_Valore, valore_ ecc più. –

+0

Dobbiamo chiamarli 'm ...'? : P Da una prospettiva di Programmazione Funzionale che ti piacerebbe pensare a pensare prima di usare lo stato/Da una prospettiva OO, sarebbe "normale". Per certi tipi di cose questo sembrerebbe * davvero * brutto. Alcuni "standard" di programmazione non dicono alcun prefisso in quanto dovrebbe essere chiaro dal codice, sia che si tratti di un membro o di un parametro, il che va bene se si scrive codice corretto. (Personalmente non uso la notazione ungherese, ma mi aggrappo al prefisso [con "_"] sapendo che è sbagliato. Detesterei dover prefisso "questo" dappertutto). Penso che questo sia un chiaro caso in cui non esiste una soluzione OSFA. –

0

Nella definizione di classe, utilizzo solo identificatori di classe se ho parametri che sono denominati in modo simile (o lo stesso) ai membri privati ​​della classe. Evita l'ambiguità e rende il codice più facile da leggere allo stesso tempo. Non riesco a pensare a un altro caso in cui avresti bisogno di usarlo.

Problemi correlati