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
- 1. Come chiamare un metodo non const da un metodo const?
- 2. Recupero dei messaggi da postgres
- 3. Elenco degli ID dei messaggi leggibili da parte di pylint?
- 4. Metodo Const che accede a variabili statiche
- 5. Test dei messaggi HL7
- 6. L'uso di const in un metodo
- 7. Metodo const C++ su membro puntatore non const
- 8. Ordinamento dei messaggi
- 9. Soppressione di un trattino "." in uscita numerica da Mathematica
- 10. Un metodo che aspetta un cambio di stato dovrebbe essere const?
- 11. Dovrei const_cast "questo" quando un metodo accetta solo Foo * const?
- 12. Creare un metodo ruby che accetta un hash dei parametri
- 13. Come posso testare le funzioni Perl che stampano sullo schermo?
- 14. Formattazione dei messaggi di commit
- 15. Ordine di tempo dei messaggi
- 16. Soppressione dell'output di gc()
- 17. Come ottenere messaggi di errore da thread ruby
- 18. Color.FromArgb (...); la protezione dei messaggi
- 19. Soppressione uscita
- 20. tratto da rilasciare const da un tipo di funzione membro?
- 21. C# - Catturare messaggi Windows da un'applicazione specifica
- 22. RabbitMQ-- recupero selettivo dei messaggi da una coda
- 23. In che modo Akka gestisce le versioni dei messaggi?
- 24. Gestione dei messaggi asincroni da parte del client Pika RabbitMQ
- 25. lettura da unordered_map const
- 26. BaseLayerAndroid che crea la distruzione dei messaggi di registro
- 27. Querying database dei messaggi SQLite di Thunderbird da C#
- 28. Filtraggio dei messaggi log4j da framework di terze parti?
- 29. Eredità da std :: true_type vs static consttor const const member
- 30. Soppressione dell'output di debug sbt
È possibile definire il contatore locale nella propria funzione come variabile statica. –