2013-11-01 18 views
5

Ich habe eine Klasse mit einer Methode, die einige Prüfungen auf einige Variablen durchführt und einen Wert zurückgibt und schließlich eine Warnmeldung ausgibt. Da die Methode keine Klassenvariable ändert, habe ich sie als const definiert. Um jedoch die Ausgabe nicht zu überfluten, möchte ich den Warndruck nach wenigen (oder nur einem) Ausdrucken unterdrücken. Ich war nicht in der Lage, eine Lösung zu finden, die die Methode konstant hält, ist das möglich (einfach)?Meldungen unterdrücken, die von einer Konst-Methode drucken

+0

Sie können den lokalen Zähler in Ihrer Funktion als statische Variable definieren. –

Antwort

8

Wie wäre es mit mutable Zähler? Ich denke, es sollte akzeptabel sein, da es sich nicht um einen Objektzustand handelt, sondern um einen internen logischen Zustand.

So etwas wie diese

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

Da es viele Kommentare über Multithreading Beispiel mit atomaren Zählern sind

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 Aber Sie sollten sicherstellen, dass Sie nicht auf Probleme mit Multi-Threading stoßen. Wenn eine Methode mit "const" gekennzeichnet ist, erwarten Benutzer normalerweise, dass sie MT-sicher ist. Daher sollten Sie stattdessen einen Atomzähler in Betracht ziehen. –

+0

@DanielFrey Sie haben Recht, aber ich denke, dass es für dieses Beispiel Übermaß ist. – ForEveR

+0

@DanielFrey für einen Fehlerunterdrücker Ich könnte eine kleine Race-Bedingung zugeben, aber natürlich in heiklen Situationen sollte man auch Atomizität hinzufügen. – DarioP

0

können Sie (zum Aufkleben Zähler Beispiel von forever)

  • werfen const weg über const_cast<int>(counter)
  • eine Variable als Zähler verwendet werden, die nicht in diesem Objekt

Die Lösung eigentliche Problem auf Sie hängt, würden Sie ein Code-Snippet auf die Frage hinzufügen?

+0

Ich würde eine const_cast von Entwurf vermeiden und der Zähler sollte im Objekt bleiben, da jede Instanz ihren spezifischen Zähler haben sollte. Ich denke, veränderbar passt sehr gut zu diesem Fall. Für ein Code-Snippet siehe ForEveR's Antwort, er hat genau den Punkt. – DarioP

+0

@DarioP: Ich sehe, deshalb habe ich nach einem Code-Snippet gefragt :) aber der Fragetitel lässt dies offen, so dass mein Vorschlag eine Option für andere sein könnte.Und das Wort _suppress messages_ schien mir so, als würdest du gegen eine Compiler-Warnung kämpfen ... – Wolf

+0

... also habe ich eine Änderung an deiner Frage vorgenommen, die möglicherweise noch nicht genehmigt wurde. – Wolf

Verwandte Themen