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
risposta
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;
};
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;
};
+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. –
@DanielFrey hai ragione, ma penso che sia eccessivo per questo esempio. – ForEveR
@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
Si può (si attaccano alla contatore esempio da forever)
- gettato
const
via viaconst_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?
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
@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
... quindi ho apportato una modifica alla tua domanda, che potrebbe non essere ancora approvata. – Wolf
È possibile definire il contatore locale nella propria funzione come variabile statica. –