2013-11-01 11 views
5

Ho una classe con un metodo che esegue alcuni controlli su alcune variabili e restituisce un valore e, alla fine, stampa un messaggio di avviso. Poiché il metodo non modifica alcuna variabile di classe, l'ho definita come const. Tuttavia, per evitare di inondare l'output, vorrei sopprimere la stampa di avvertenza dopo poche (o solo una) stampa. Non sono stato in grado di trovare una soluzione mantenendo il metodo const, è possibile (facile)?Soppressione dei messaggi che stampano da un metodo const

+0

È possibile definire il contatore locale nella propria funzione come variabile statica. –

risposta

8

In che modo utilizzare il contatore mutable? Penso che dovrebbe essere accettabile, dal momento che non è lo stato dell'oggetto, è lo stato logico interno.

Qualcosa di simile

class Printer 
{ 
public: 
    Printer() : counter(0) {} 
    void output() const 
    { 
     if (counter++ < max_warnings) 
     { 
     std::cout << "Something special" << std::endl; 
     } 
    } 
private: 
    static const size_t max_warnings = 5; 
    mutable size_t counter; 
}; 

Live example

Dal momento che ci sono molti commenti su multithreading, ad esempio con contatore atomica

class Printer 
{ 
public: 
    Printer() : counter(0) {} 
    void output() const 
    { 
     if (counter++ < max_warnings) 
     { 
     std::cout << "Something special" << std::endl; 
     } 
    } 
private: 
    static const size_t max_warnings = 5; 
    mutable std::atomic<size_t> counter; 
}; 
+3

+1 Ma dovresti assicurarti di non avere problemi con il multi-threading. Se un metodo è contrassegnato come 'const', gli utenti di solito si aspettano che sia sicuro per MT, quindi potresti prendere in considerazione l'utilizzo di un contatore atomico. –

+0

@DanielFrey hai ragione, ma penso che sia eccessivo per questo esempio. – ForEveR

+0

@DanielFrey per un soppressore di errori Potrei ammettere una piccola condizione di gara, ma naturalmente in situazioni più delicate si dovrebbe aggiungere anche l'atomicità. – DarioP

0

Si può (si attaccano alla contatore esempio da forever)

  • gettato const via via const_cast<int>(counter)
  • utilizzare una variabile come contatore che non è in questo oggetto

La soluzione dipenderà da voi problema reale, è necessario aggiungere un frammento di codice per la domanda?

+0

Eviterei un const_cast in base alla progettazione e il contatore dovrebbe rimanere nell'oggetto in quanto ogni istanza dovrebbe avere il suo contatore specifico. Penso che mutabile si adatta molto bene a questo caso. Per uno snippet di codice, fai riferimento alla risposta di ForEveR, lui ha esattamente il punto. – DarioP

+0

@DarioP: Capisco, è per questo che ho chiesto uno snippet di codice :) ma il titolo della domanda lascia aperta questa opzione, quindi il mio suggerimento potrebbe essere un'opzione per gli altri.E la parola _suppress messages_ mi è sembrata come se stessi combattendo contro un avvertimento del compilatore ... – Wolf

+0

... quindi ho apportato una modifica alla tua domanda, che potrebbe non essere ancora approvata. – Wolf

Problemi correlati