2013-11-01 30 views
5

Bazı değişkenler üzerinde bazı denetimler gerçekleştiren ve bir değer döndüren ve sonuç olarak bir uyarı iletisi basan bir yönteme sahip bir sınıfım var. Yöntem herhangi bir sınıf değişkenini değiştirmediğinden, onu const olarak tanımladım. Ancak, çıkıştan su basmaktan kaçınmak için, birkaç (veya sadece bir) baskıdan sonra uyarı yazdırmayı bastırmak istiyorum. Yöntem yapısını koruyan bir çözüm bulamadım, bu mümkün mü (kolay)?Bir const yönteminden yazdırılan iletileri bastırın

+0

Yerel sayaç işlevinizde statik değişken olarak tanımlayabilirsiniz. –

cevap

8

mutable sayacına ne dersiniz? Bence, kabul edilebilir olmalı, çünkü bu nesnenin durumu değil, içsel mantık halidir. Bu

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

Sen (sonsuza gelen sayaç örneğe yapışmasını olabilir

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 Ancak, çok iş parçacığı ile sorun yaşamadığınızdan emin olmalısınız. Bir yöntem 'const 'olarak işaretlenmişse, kullanıcılar genellikle MT-safe olmasını beklerler, bu yüzden bir atomik sayaç kullanmayı düşünebilirsiniz. –

+0

@DanielFrey haklısınız, ama bence, bu örnek için fazla. – ForEveR

+0

@DanielFrey bir hata bastırıcısı için küçük bir yarış koşulunu kabul edebilirdim, ama elbette daha hassas durumlarda bir de atomiklik eklemeliyim. – DarioP

0

atom sayaç ile çoklu kullanım, örneğin ilgili birçok yorum vardır yana gibi

şey

  • , sen soruya bir kod parçası eklersiniz bu nesnenin çözümü gerçek sorun size bağlıdır

değil sayaç olarak bir değişken kullanın const_cast<int>(counter)

  • aracılığıyla uzak const döküm?

  • +0

    Tasarım gereği const_cast'den kaçınacağım ve sayacın herhangi bir örneğinin kendi sayacı olması gerektiğinden nesne içinde kalması gerekir. Bu durumun çok iyi uyum sağlayabileceğini düşünüyorum. Bir kod pasajı için lütfen ForEveR'in cevabına bakın, tam anlamı var. – DarioP

    +0

    @DarioP: Anladım, bu yüzden bir kod snippet'i istedim :) ama soru başlığı bunu açık bırakıyor, bu yüzden önerim başkaları için bir seçenek olabilir.Ve _suppress messages_ kelimesi bana bir derleyici uyarısına karşı savaştığınız gibi görünüyordu ... – Wolf

    +0

    ... bu yüzden sorunuza bir değişiklik yaptım, bu da henüz onaylanmamış olabilir. – Wolf

    İlgili konular