Data la descrizione della situazione, direi che usare i membri static const
è un buon approccio. In C++ 11 potresti volerlo cambiare in static constexpr
per enfatizzare che è una costante in fase di compilazione, anche se nulla cambierà di conseguenza.
Se si fa riferimento a myclass::kMyClassContant_
da qualche parte nel codice in un modo che è rilevante ai sensi della regola a una definizione (odr), esp. in contesti che richiedono un riferimento (incluso il riferimento const), il compilatore si lamenterà che non esiste una definizione della costante. In questo caso non è sufficiente dichiararlo e inizializzarlo all'interno della classe. Questo può costringere a separare la dichiarazione e la definizione:
// mycode.h
class myclass {
private:
static const uint16_t kMyClassConstant_;
};
// mycode.cpp
const uint16_t myclass::kMyClassConstant_ = 0xBEEF;
Per evitare la fatica di mantenere le dichiarazioni e le definizioni separati, alcune persone preferiscono dichiarare una funzione inline constexpr invece di una variabile reale:
// mycode.h
class myclass {
private:
static constexpr uint16_t kMyClassConstant_()
{ return 0xBEEF; }
};
Questo è un corretto work-around per molti dei problemi relativi a odr e non causa alcuna perdita di prestazioni. Se sia davvero utile dipende da quanto sia oneroso mantenere dichiarazioni e definizioni separate di una costante statica ordinaria. Se ti aspetti che le tue costanti non cambino mai mentre il tuo codice si evolve, è preferibile utilizzare costanti statiche ordinarie con definizioni separate. Ma se si modificano frequentemente le definizioni delle costanti, la necessità di ricompilare il file di definizione e ricollegarlo a tutte le parti rilevanti del progetto può far considerare la soluzione basata su funzioni come alternativa migliore.
Un commento finale sul tipo di dati: forzandolo a 16 bit utilizzando std::uint16_t
può essere utile se è necessario memorizzare molti di questi valori in forma compatta. In caso contrario, le dimensioni effettive potrebbero non essere importanti, nel qual caso std::uint_fast16_t
(che può essere maggiore di 16 bit) potrebbe essere migliore.
No, non c'è niente di sbagliato in questo. (Si spera che alcuni esperti di C++ non debbano correggermi :)) – xxbbcc
È possibile ottenere risposte migliori su http://codereview.stackexchange.com. –
Sì, è un modo normale di dichiarare una costante globale. –