2010-12-29 12 views
25

Wann haben Sie C++ mutable Schlüsselwort verwendet? und warum? Ich glaube nicht, dass ich jemals dieses Schlüsselwort verwenden musste. Ich verstehe, dass es für Dinge wie Caching (oder vielleicht Auswendiglernen) verwendet wird, aber in welcher Klasse und in welchem ​​Zustand mussten Sie es jemals benutzen?Wann haben Sie C++ 'veränderbares' Schlüsselwort verwendet?

+5

möglich Duplikat [vs. wandelbar volatile in C++] (http://stackoverflow.com/questions/ 2444695/volatile-vs-veränderbar-in-c) – Andrey

+5

Meinst du [Memoisierung] (http://en.wikipedia.org/wiki/Memoization)?Seltsam, wie es scheinen mag, ist es kein Tippfehler der "Auswendiglernen" –

+0

@Andrey: wtf, wie ist diese Frage auch nur entfernt ähnlich –

Antwort

38

Gelegentlich verwende ich es ein Mutex oder anderen Thread Synchronisierungsgrund als wandelbar zu markieren, so dass Accessoren/Abfragemethoden, die const typischerweise markiert sind nach wie vor den Mutex sperren.

Es ist auch manchmal nützlich, wenn Sie Ihren Code für Debugging- oder Testzwecke instrumentieren müssen, da die Instrumentierung oft Hilfsdaten aus den internen Abfragemethoden modifizieren muss.

+10

Dies ist die am häufigsten verwendete Verwendung für mutable in dem Code, mit dem ich gearbeitet habe. Tatsächlich setze ich standardmäßig "muable mutex" ein, wenn ich sie deklariere, ohne jemals darüber nachzudenken, ob das "mutable" -Schlüsselwort von der Sprache benötigt wird. Schließlich ist der Mutex nicht Teil des Zustands des Objekts. –

+0

Das ist meistens, wofür ich es benutzt habe. –

3

http://msdn.microsoft.com/en-us/library/4h2h0ktk%28v=vs.80%29.aspx wäre das beste Beispiel. Hey, ich habe heute etwas gelernt!

+0

Ich kann sehen, wie das nützlich ist, aber ich kann immer noch nicht denken, wann ich das tatsächlich tun würde (es scheint immer einen besseren Platz zu geben) –

+0

Eigentlich bin ich ein paar Mal über diese Situation gestolpert: Erstens entwarf die Klasse, so dass Teile ihrer Getter const sein würden und fügen dann etwas mehr Code hinzu, der ein Ptr verwenden würde, das von "const Ptr * Class :: getSomeMember() const;" so beschwerte sich der Compiler darüber "kann const Ptr * in diesem Zusammenhang nicht verwenden" oder so. Jetzt weiß ich, wie man das repariert :) – kellogs

1

Meine Vorlagenklasse implementiert Referenz-Counter-Muster. Wenn es an Funktionen als Argument mit const Modifizierer übergeben wird, ist es möglich, dass die Referenz sowieso erhöht werden kann. So kann statt const_cast veränderbar verwendet werden.

+0

hmm, interessant. Ist es besser, YourTemplate anstatt const YourTemplate zu tun? würde das nicht lösen? +1 anyways –

+0

@ acidzombie24 - wenn innere Klasse ist wirklich const das ist wahr, aber für den allgemeinen Zweck ist sehr restriktiv. – Dewfy

4

In Mock-Objekten, um den Wert von Argumenten von const-Funktionen in einer Elementvariablen zu erfassen.

class Source 
{ 
public: 
    virtual ~Source() {} 
    virtual std::string read(int count) const=0; 
}; 

class SourceMock : public Source 
{ 
public: 
    mutable std::vector<int> arguments; 
    std::string read(int count) const { 
     arguments.push_back(count); 
     return "..."; 
    } 
}; 

//TEST.... 
SourceMock mock; 
//... 
VERIFY(mock.arguments.size()==2); 
VERIFY(mock.arguments[0]==3); 
//... 
+0

+1 coole situation. Ich habe immer noch Schwierigkeiten, mir vorzustellen, wann das funktionieren würde, aber ich kann das glauben. –

10

Google code search zeigt eine Reihe von Anwendungen. Zum Beispiel werden in einer Implementierung von XTR cryptography änderbare Elemente verwendet, so dass Methoden einen Verweis auf ein Ergebnis zurückgeben können (wodurch verhindert wird, dass Kopien erstellt werden).

Für ein anderes Beispiel verwendet Webkit es, um Elementdaten (m_lineHeight) zu initialisieren.

+0

bereitgestellten Links sind gebrochen –

3

Ich benutze es beim Sperren eines Mutex für Thread-Sicherheit. Der Mutex wird als veränderbar markiert, so dass die Methoden, die ihn sperren, const bleiben können.

11

ich bei Objekt-Caching Ergebnisse wandelbar verwendet haben aus internen Mitgliedern berechnet:

class Transformation 
{ 
    private: 
     vec3 translation; 
     vec3 scale; 
     vec4 rotation; 
     mutable mat4 transformation; 
     mutable bool changed; 
    public: 
     Node() 
     { 
      [...] 
      changed = false; 
     } 
     void set_translation(vec3 _translation) 
     { 
      translation = _translation; 
      changed = true; 
     } 
     void set_scale(...) ... 


     mat4 get_transformation() const 
     { 
      if(changed) 
      { 
       // transformation and changed need to be mutable here 
       transformation = f(translation, scale, rotation); // This take a long time... 
       changed = false; 
      } 
      return transformation; 
     } 
}; 

void apply_tranformation(const Transformation* transfo) 
{ 
    apply(transfo->get_transformation()); 
} 
4

Ich benutze mutable für die Teilnehmer, die bei Bedarf initialisiert werden, vor allem aus einer Datenbank oder Quelle außerhalb des Programms. Dies ermöglicht den "Getter" -Funktionen, das Objekt auf Anforderung zu erstellen, andernfalls ist es eine konstante Methode.

0

Es kann in vielen Szenarien verwendet werden, z

Loggers, timing, access counters usw.

Diese können ohne Änderung des Status der Daten in const qualifizierten Accessoren aufgerufen werden.

0

wandelbar Schlüsselwort können Sie eine Variable in einem konst Kontext

zB ändern:

class Person { 
private: 
     mutable int age; 

public: 
    Person(int age) : age(age) { 

    } 
    void setAge(int age) const { 
     Person::age = age; 
    } 

    int getAge() const { 
     return Person::age; 
    } 
}; 

int main() { 

    Person person(23); 
    std::cout << "Person age " << person.getAge() << std::endl; 
    person.setAge(24); 
    std::cout << "Person modified age " << person.getAge() << std::endl; 
    return 0; 
} 
Verwandte Themen