stiftmaster hat folgendes geschrieben: |
Leider habe ich dort die Verwendung von properties nicht wirklich gefunden. Gibt es so etwas dort |
Nein, C++ macht soetwas nicht.
stiftmaster hat folgendes geschrieben: |
oder wie codet man dort so etwas sauber? |
Über Setter und Getter:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| class Something { public: SomeType getSomeField(); void setSomeField(SomeType value); protected: // oder private SomeType _SomeField; } |
Das ist der einfache Standard-Weg den jeder PRogrammierer kapiert und auch benutzt.
Wenn du unbedingt den Assign-Operator benutzen willst, bau dir eine Klasse und überlade ihn (
ungetestet!):
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| class Something;
class SomeTypeProperty { public Property(Something &parent) : _parent(parent) {}; operator SomeType() const { return _parent.getSomeField(); } SomeTypeProperty &operator=(SomeType value) { _parent.SetSomeField(value); return *this; }; private: Something &_parent; }
class Something { public: SomeType getSomeField(); void setSomeField(SomeType value); SomeTypeProperty SomeField;
Something() : SomeField(this) {}; protected: // oder private SomeType _SomeField; } |
Damit kannst du Something::SomeField wie ein DelphiLanguage-Property benutzen, dem du Variablen vom Typ SomeType zuweisen kannst.
Das Property kannst du dir in ein Template
template<class C, typename T> verpacken und dann immer wieder instanzieren. Methodenpointer für Getter und Setter kannst du dann über den Konstruktor übergeben. Oder du holst noch weiter aus, schreibst dir einen netten Functor, implementierst deine Setter und Getter als Functor, kannst diese als Template-Parameter übergeben und hast keinerlei Property-Funktionalität mehr in Something::Something(), was eine gute Sache ist, aber manchmal eben ein wenig überzogen. Außerdem macht es deinen Code fett, weil für jedes Property mit unterschiedlichem Functor und Typ eine neue Template-Instanz erzeugt wird.
Ich kenne allerdings niemanden, der das so tatsächlich macht, außer vielleicht Leuten, die unbedingt Pascal-Denkweisen auf alle Sprachen anwenden müssen, selbst wenn's Assembler ist. Und das solltest du dir gar nicht erst angewöhnen.
Der Borland-C++-Compiler hat übrigens AFAIK ein __property-Macro, das aber
nicht standard-konform ist und somit ein kaputtes ABI erzeugt (aber das tut der BCB für Win32 sowieso, wenn man libs erzeugt). Ansonsten gibt es Properties in C++ nur für C++/CLI, also wenn du für .NET programmierst.
Edit: Habe ich wirklich so lange gebraucht?

Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk.