Gibt es eine Funktion in C ++, die, wenn eine Variable geändert wurde, automatisch eine Funktion aufruft?
Nein, nicht dass ich daran denken könnte. Sie können jedoch den Zugriff auf die Variable in einem geeigneten Wrapper umbrechen, der es Ihnen ermöglicht, in die Zuweisung einzudringen.
Etwas wie das:
Wie Noah in einem Kommentar notierte,
%Vor% (oder, wenn Ihr Compiler es hat, std::tr1::function
oder std::function
) würde dies erheblich verbessern, weil es erlaubt alle Arten von "kompatiblen" Funktionen aufzurufen. (Zum Beispiel aktiviert es alle Arten von Magie mit boost/std::/tr1::bind<>
, um Member-Funktionen aufzurufen und was nicht.)
Beachten Sie auch, dass dies, wie adf88 in seinen Kommentaren sagte, genau das tut, wonach es gefragt wurde (Schreibzugriff auf eine Variable überwachen) und es sich keineswegs um eine vollwertige Property-Implementierung handelt. In der Tat, trotz C ++ 'Einstellung, so viel wie möglich in Bibliotheken und so wenig wie möglich in der Sprache zu implementieren, und trotz der Versuche vieler Leute (einige von ihnen ziemlich schlau), hat niemand einen Weg gefunden, Eigenschaften in C ++ zu implementieren als Bibliothek , ohne Unterstützung von der Sprache.
In einem Wort; Nein.
Aber was Sie tun sollten, ist die Variable in eine Klasse zu packen (ich werde nicht vorschlagen, dass der Operator überladen wird) und sie über eine set (...) Funktion ändern. Dann rufen Sie einfach die Funktion von der Set-Funktion auf.
Sie könnten die Variable privat für eine Klasse machen und dann die Elementfunktionen für die Änderung an erster Stelle verwenden.
Sie können Ihren zusätzlichen Code in die Member-Funktion selbst einfügen, oder Sie können diesen Code trennen und die Member-Funktion bei Änderung aufrufen lassen.
Abhängig von der Komplexität Ihres Programms können Sie Listener verwenden, die bestimmte Objekte auf Zustandsänderungen überwachen und andere Teile Ihres Programms Ereignisse von diesem Listener abonnieren lassen.
Die beste Option wäre jedoch, diese Funktionalität in die Setter-Methode für diese Variable zu integrieren. Es könnte eine Listener-Funktionalität oder ein direkter Funktionsaufruf sein.
Wenn die Variable einen Klassentyp hat, können Sie ihre Funktion operator =()
überladen. Dies ist nicht möglich, wenn die Variable ein primitiver Typ ist.