schreibgeschützte Attribute einer Klasse



  • Hallo, ich soll ne Klasse schreiben die nur ein schreibgeschütztes Attribut besitzt - alle anderen sollen ganz normal verwendet werden. Nun habe ich folgende Lösung: in der Main wird ein const Objekt erzeugt:

    const Klasse object(4,5);

    Um mit diesem Objekt die Methoden anzusprechen müssen sie ebenfalls als Read only deklariert werden, um diese auch mit den Const Objekten nutzen zu können:

    methode() const;

    Der Effekt die Werte 4 und 5 können nicht mehr geändert werden - dies gilt für alle Attribute. Jetzt soll aber nur ein Attribut schreibgeschützt sein??? Wie soll das gehen???



  • Du legst als private ab und legst nur eine Methode zum lesen an ?



  • Probies mal so:

    class A
    {
        int attri;
      public:
        //andere Attribute, nicht schreibgeschützt
        //konstruktoren und destruktoren
        void getatt(){return attri;};
    }
    
    int main()
    {
      A const oa(4.5);
      int x;
    
      x=oa.getatt(); //liefert das schreibgeschützte attri zurück
    };
    

    Ist so ziehmlich, dass was Knuddlbaer meinte nur mit Code 😃



  • @KaraHead

    class A
    {
        int attri;
      public:
        //andere Attribute, nicht schreibgeschützt
        //konstruktoren und destruktoren
        void getatt()const {return attri;}  // hier muss nen const hin da das   
                                            // objekt const ist sonst Fehler..
                                            // jetzt ist es eine read only methode
    }
    

    wenn man in der main ein konstantes Objekt initialisiert, dann sind alle Klassenattribute schreibgeschützt - der kompiler meckert, wenn man dann je eine variable hochzählen sollte... so ist es gedacht -> nur mein Problem ist es, dass ich von mehreren Klassenattrinuten nur eine Variable schreibgeschützt haben soll und nicht alle, wie im Beispiel oben.

    Der Sinn soll sein, dass ein Programmierer nicht mehr in der Lage ist die schreibgeschützte konstante variable zu verändern... also bei einer Setfunktion die eine Schreibgeschützte variable hochzählen möchte -> gibt es eine Fehlermeldung vom Compiler - so soll es sein - wie das verhalten eines const objektes mit read only methoden.
    hmm noch nen vorschlag???



  • Ist das zu einfach? 😉

    class X
    {
        const int x;
    
    public:
        void boesewicht()
        {
            ++x; // Compilerfehler
        }
    };
    


  • ja isses, das Problem ist, dass i nie initialisiert sondern nur deklariert wurde d.h. keinen wert hat und in dem Fall auch nie einen bekommen kann - ist aber ziel bei der oop. Die variable muss initialisierbar bleiben und zawr beim Konstruktoraufruf...

    in dem Fall passiert folgendes;

    const int x; //deklariert in private alles schön
    jetzt muss es noch initialisiert werden im konstruktor...

    jetzt passiert folgendes:

    x=y; // Compilerfehler, da x jetzt neu gesetzt wird...



  • pinorrix schrieb:

    ja isses, das Problem ist, dass i nie initialisiert sondern nur deklariert wurde d.h. keinen wert hat und in dem Fall auch nie einen bekommen kann - ist aber ziel bei der oop. Die variable muss initialisierbar bleiben und zawr beim Konstruktoraufruf...

    Kein Problem, Stichwort Initialisiererliste:

    class X
    {
        const int x;
    
    public:
        X(int a)
          : x(a) { }
    
        void boesewicht()
        {
            ++x; // Compilerfehler
        }
    };
    


  • danke das ist die Lösung bin immer wieder erstaunt wie schnell sich hier probleme klären lassen.. und wieder was dazu gelernt 🙂

    class klasse  
    {
    public:
    	klasse(int a, int b) : o(a) { this-> b=b; }
    	int geto() { return o;}
    	int getb() { return b;}
    	//int seto() { o++; }    // Compilerfehler da o const
    	virtual ~klasse();
    private:
    	const int o;
    	int b;
    };
    
    void main()
    {
    	klasse p(8,9);
    
    	cout << p.geto() << endl;  
    	cout << p.getb() << endl;
    }
    

Anmelden zum Antworten