Metodi Const e non-const e possibile membro di dati mutabili?

0

Sto lavorando a un cambiamento di progettazione e implementazione a causa di un bug. La correzione di bug ci richiede di modificare un oggetto di classe in un metodo const. Penso che le due opzioni siano:

  1. Il metodo non-const ha lanciato this in const (e quindi chiama il metodo const)?
  2. Il metodo const ha gettato via const-ness (e quindi chiama il metodo non-const)?

Nel caso di (1), dobbiamo dichiarare i membri dei dati come mutabili.

Nel caso di (2), possiamo eliminare i membri di dati mutabili.

La terza opzione - non entrare in questa situazione in primo luogo - non è più disponibile.

Qual è la migliore pratica per un metodo const e un metodo non const che funziona sui dati dei membri? O, per dirla in altro modo, come dovrebbe procedere la progettazione e l'implementazione?

Le rotazioni sono dovute a un bug fix e al nostro estremo desiderio che "le cose funzionino" con il codice esistente. Non vogliamo forzare gli utenti a riscrivere il loro codice, quindi facciamo qualcosa pigramente in un metodo const (gli utenti chiamano Foo e non hanno mai chiamato Bar fino alla correzione):

void Foo() const
{
    // Added due to bug fix
    if(!m_bar)
        Bar();
}

void Bar() const
{
    // m_1 and m_2 are mutable
    m_1 = ...
    m_2 = ...

    // m_3 and m_4 are untouched...

    m_bar = true;
}

Il problema in realtà va più in profondità nel design. Ad esempio, Bar è dichiarato virtuale e non-const in una classe base. Quindi dobbiamo fare queste cose evitando di nascondere il nome.

Una domanda simile che prende un po 'dell'approccio mutevole: È una cattiva idea usare mutable per i temporari pre-assegnati?

    
posta jww 12.06.2015 - 08:00
fonte

1 risposta

4

Ci sono sempre due lati della costanza: essere const nel senso del linguaggio di programmazione ed essere logicamente costanti. Supponiamo che un oggetto C ++ abbia un puntatore a un oggetto std :: string. Se l'oggetto C ++ è const, non posso cambiare il puntatore in modo che punti a un oggetto std :: string diverso. Tuttavia, posso modificare il contenuto dell'oggetto std :: string. Che non cambia l'oggetto nella vista della lingua, ma modifica logicamente l'oggetto.

i metodi const non dovrebbero cambiare logicamente l'oggetto. Usando "mutable", possono cambiare l'oggetto. Se si dispone ad esempio di un oggetto cache, è logicamente invariato se fornisce le stesse risposte alle stesse richieste. Il fatto che carichi qualche oggetto dal disco alla memoria o lo scarichi dalla memoria non cambia il modo in cui reagisce alle richieste.

Cose come il caching, il calcolo su richiesta, la modifica di una rappresentazione interna, non cambiano logicamente l'oggetto, quindi sarei Ok nel rendere le cose mutabili e modificarle in un metodo const.

    
risposta data 12.06.2015 - 19:49
fonte

Leggi altre domande sui tag