Klasse - Eigenschaften mit Get() und Set()



  • Hey,

    Ich schreibe derzeit an einer kleinen Klasse, in der Propertys sein sollen, die jeweils mit get() und set() Methoden arbeiten. Sprich ich möchte keine Variable public machen und dann sowas haben:

    obj.var = 1;
    cout << obj.var;

    sondern, dass bei der Zuweisung eine set Funktion und bei dem Abfragen eine get Funktion aufgerufen wird. Im Internet lese ich nur, dass C++ sowas nicht unterstützen soll, aber meine Quellen stammen fast nur von Zeiten vor C++11 also stelle ich hier meine Frage!

    Vielen Dank!



  • Das geht in C++ nur über Umwege (braucht man auch eigentlich nicht C++11 für):

    template <typename T>
    class property_proxy
    {
    public:
    	using value_type = T;
    	using set_fnc	 = std::function<void(T)>;
    	using get_fnc	 = std::function<T()>;
    
    	property_proxy(set_fnc setter, get_fnc getter) noexcept
    	: setter_(std::move(setter)), getter_(std::move(getter)) {}
    
    	property_proxy& operator= (value_type val)
    	{
    		setter_(val);
    		return *this;
    	}
    
    	operator value_type()
    	{
    		return getter_();
    	}
    
    private:
    	set_fnc setter_;
    	get_fnc getter_;
    };
    
    class obj_t
    {
    public:
    	obj_t() : var(some_setter, some_getter) {}
    
    	property_proxy<int> var;
    private:
    	void some_setter(int);
    	int some_getter();
    };
    

    Nachteil:
    Man kann von var keine Member aufrufen, also obj.var.foo() o.ä. geht nicht.



  • hey,

    ersteinmal vielen Dank für deine Antwort!

    mir sagen leider diese Ausdrücke garnichts:

    property_proxy(set_fnc setter, get_fnc getter) noexcept
        : setter_(std::move(setter)), getter_(std::move(getter)) {}
    
    //-----
    
     obj()_t : var(some_setter, some_getter) {}
    

    bzw ich präzisiere etwas:
    - property_proxy(set_fnc setter, get_fnc getter) -> Konstruktur - OK!
    - noexcept - sagt mir nichts
    - : setter_(std::move(setter)), getter_(std::move(getter)) {}
    verstehe ich leider garnicht.. Den ":" habe ich so noch nie gesehn, std::move kenne ich nicht und diese Aneinanderreihung von Funktionen VOR den geschweiften Klammern ist mir unklar

    - für die Zeile obj()_t gilt selbiges 😕

    Tut mir leid für die zusätzliche Arbeit, ich würde das nur gern verstehn 🙂

    Danke!



  • Das noexcept ist ein C++ Feature und besagt, dass in dieser Funktion keine Exceptions geworfen werden.
    Das mit dem Doppelpunkt ist eine Initialisierungsliste, die die Konstruktoren der Member aufruft, sollte man schonmal gesehen haben.

    Edit: Das _t ist beim Tippen an die falsche Stelle gerückt, sollte vor die Klammern. 😉



  • Ah okay vielen Dank, das mit dem Doppelpunkt habe ich leider so noch nie gesehn, verstehe es ehrlich gesagt immer noch nicht ganz 😕

    Hast du vllt einen Link?




Log in to reply