Read only Eigenschaften von Klassen
-
Hallo
Standard C++
class TMyClass { public: UnicodeString GetMyString() {return MyString;}; // Getter-Methode // void SetMyString(UnicodeString x) {MyString = x;}; // Setter-Methode, hier nicht verfügbar private : UnicodeString MyString; }; TMyClass *MyClass = new TMyClass(); MyClass->MyString = "Hallo Welt"; // geht nicht UnicodeString x = MyClass->GetMyString();
VCL
class TMyClass { public: __property UnicodeString MyString = {read = _MyString}; private : UnicodeString _MyString; }; TMyClass *MyClass = new TMyClass(); MyClass->MyString = "Hallo Welt"; // geht nicht UnicodeString x = MyClass->MyString; // geht
Weiterführendes zum Thema VCL-Eigenschaften findest du hier.
Noch zwei Anmerkungen :
- Verwende mit new erstellte Instanzen immer nur, wenn du wirklich dynamischen Speicher brauchst. In diesem Beispiel ist es nicht nötig. Und wenn du new verwendest, must du auch immer die Instanz mit delete wieder löschen
- Verwende lieber String anstelle von UnicodeString. Der Compiler kümmert sich dann um den richtigen Stringtyp.bis bald
akari
-
Ok, soweit so gut. Ich hab nun auch festgestellt, dass die Standard-C++ Syntrax unter CodeGear nicht funktioniert. Kann ich denn in der VCL-Syntax auch komplexere Setter-Funktionen umsetzen, beispielsweise mit Überprüfung des Strings?
Übrigens: Erstaunlicherweise finde ich in meinem C++-Buch keine Doku zu Getter und Setter. Haben die offiziell eine andere Bezeichnung?
-
Heimelchen schrieb:
Ich hab nun auch festgestellt, dass die Standard-C++ Syntrax unter CodeGear nicht funktioniert.
Und wie bitte hast da das festgestellt?
-
Hallo
Die C++ Syntax muß auch im CodeGear funktionieren.
Ja du kannst in die property-Deklaration auch Methoden einbinden. Wie das geht steht in der von mir verlinkten Seite.
bis bald
akari
-
VergissEs schrieb:
Heimelchen schrieb:
Ich hab nun auch festgestellt, dass die Standard-C++ Syntrax unter CodeGear nicht funktioniert.
Und wie bitte hast da das festgestellt?
Ich hab es ausprobiert und es lief nicht.
-
Hallo
"läuft nicht" und "funktioniert nicht" sind keine ausreichende Fehlerbeschreibungen. Da kann dir auch niemand weiterhelfen.
bis bald
akari
-
MyClass hat keine Eigeschaft "MyString".
-
Hallo
Dieser Quellcode
class TMyClass { public: String GetMyString() {return MyString;}; // Getter-Methode // void SetMyString(UnicodeString x) {MyString = x;}; // Setter-Methode, hier nicht verfügbar private : String MyString; }; ... TMyClass *MyClass = new TMyClass(); // MyClass->MyString = "Hallo Welt"; // geht natürlich nicht String x = MyClass->GetMyString();
kompiliert ohne weitere Änderung auf meinem BCB5 ohne Fehler. Du hast etwas bei der Übernahme des Quellcodes falsch gemacht.
bis bald
akari
-
akari schrieb:
String x = MyClass->GetMyString();
Ne, du hast bei der Übernahme was falsch gemacht.
Gewollt ist:
String x = MyClass->MyString();
-
Hallo
Du kannst deine Methode nennen wie du willst. Nur die Methode und die Membervariable dürfen nicht gleich heißen. In meinem Beispiel ist GetMyString() also völlig korrekt.
bis bald
akari
-
Aber wenn ich auf TComponent::Components zugreifen will, verwende ich ja auch TComponent::Components und nicht TComponent::GetComponents(). Ein signifikanter Unterschied läge darin, dass hinter dem einen Klammern stehen, hinter dem andern nicht. Abgesehen vom Namen natürlich...
PS: Bei mir hat sich auch nen Fehler eingeschlichen: gewollt ist:
String txt = MyClass->MyString;
-
Hallo
Ich sehe immer noch nicht dein Problem. TComponent hat eben eine property die Components heißt und vom Typ Array ist. Möglich das es intern auch direkt lesend auf ein Array namens iComponents zugreift. Aber nichts davon widerspricht meinem Beispiel.
bis bald
akari
-
Hallo heimelchen,
akari hat dir hier http://www.c-plusplus.net/forum/viewtopic-var-p-is-1944764.html#1944764
doch schon die Lösung mittels Eigenschaften (Properties) genannt (Beispiel "VCL")...
-
Heimelchen schrieb:
Ich hab nun auch festgestellt, dass die Standard-C++ Syntax unter CodeGear nicht funktioniert.
Ich hab auch nicht behauptet, dass es mit __property nicht funktioniert...
-
Hallo
Und welche Frage ist denn nun noch offen?
/Edit : Natürlich funktioniert meine konkrete C++ Version auch nur bei VCL-Einbindung, da ich den Datentyp UnicodeString verwendet habe. Wenn du UnicodeString durch std::string ersetzt brauchst du keine VCL mehr. Aber das sollte doch wohl klar sein?
bis bald
akari
-
Alles beantwortet.