Join Date: Aug 2007
Posts: 8643
User-Rating:
|
Hallöchen,
wer mit der VCL oder .NET programmiert, der kennt sicher Properties in Klassen, die man durch Getter und Setter steuern kann.
CSHARP Code: class PropTest { private int var; public int Var { get { return var; } set { var = value; } } } PropTest pt = new PropTest(); pt.Var = 123; int var = pt.Var;
Im normalen C++ gibt es sowas leider (noch) nicht. Aber dank den neuen C++11 Features wie Lambdas kann man sich da was schönes selbst basteln:
CPP Code: //Property.hpp #include <functional> template<typename ValueType> class Property { public: Property() { } //--------------------------------------------------------------------------- Property(const std::function<ValueType()> &get, const std::function<void(ValueType)> &set) { this->get = get; this->set = set; } //--------------------------------------------------------------------------- ValueType operator = (const ValueType& value) { if (set == nullptr) { throw 1; } set(value); return value; } //--------------------------------------------------------------------------- operator ValueType() { if (get == nullptr) { throw 1; } return get(); } //--------------------------------------------------------------------------- private: std::function<ValueType()> get; std::function<void(ValueType)> set; };
CPP Code: class PropTest { public: PropTest() : Var( //getter [this]() { return var; }, //setter [this](int value) { var = value; }) { } Property<int> Var; private: int var; }; PropTest pt; pt.Var = 123; int var = pt.Var;
Wenn eine Property schreibgeschütz sein soll, setzt einfach den setter auf 0, dann gibt es eine Exception, wenn versucht wird, den Wert zu schreiben:
CPP Code: Var([this]() { return var; }, 0); ... try { pt.Var = 123; } catch (...) { //pt.Var ist schreibgeschützt }
Für WriteOnly kann natürlich auch einfach der getter auf 0 gesetzt werden.
Vielleicht kanns ja einer von euch gebrauchen oder lernt zumindest was daraus.
greetz KN4CK3R
|