Read only Eigenschaften von Klassen



  • Hi,

    einige der VCL-Klassen haben Public Eigenschaften, die Read Only sind. Wie definiere ich eine Eigenschaft als Read Only?



  • Hallo

    Indem du die Setter-Methode wegläßt.

    bis bald
    akari



  • class TMyClass
    {
      public:
        UnicodeString MyString;
    };
    
    TMyClass *MyClass = new TMyClass();
    
    MyClass->MyString = "Hallo Welt";
    

    Welche Methode? Wie implemtier ich denn eine Setter/Getter-Methode für dies Beispiel?



  • 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.


Anmelden zum Antworten