Versteckte Getter / Setter



  • Hi,

    bei der WinAPI muss man, um einem Steuerelement den Inhalt zu geben / nehmen, Funktionsaufrufe durchführen.

    Ich fände aber ein

    button->text = "Hallo";
    

    viel einfacher.

    Ich habe mir folgendes Template gebaut:

    #include <tr1/functional>
    
    template <class type>
    class ObservedField {
    public:
    	type operator = (type const& rhs) {
    		if (&rhs) {
    			this->onSet(rhs);
    		}
    		return this->onGet();
    	}
    
    	type operator = (ObservedField<type> const& rhs) {
    		if (this != &rhs) {
    			this->onSet(rhs.onGet());
    		}
    		return this->onGet();
    	}
    
    	std::tr1::function<type()> onGet;
    	std::tr1::function<void(type const&)> onSet;
    };
    

    Ich kann nun:

    button->text = "Hallo";
    button->text = label->text;
    

    ohne weiteres. Also setzen anhand eines Wertes und anhand eines anderen Elements.
    Was nicht geht ist, nur den Wert abzurufen und auszugeben:

    MessageBox(this->hwnd, this->label1->text, TEXT("label1"), MB_OK | MB_ICONINFORMATION);
    

    Dies schlägt fehl mit:

    error: cannot convert 'ObservedField<const wchar_t*>' to 'LPCWSTR {aka const wchar_t*}' for argument '2' to 'int MessageBoxW(HWND, LPCWSTR, LPCWSTR, UINT)'

    Ich verstehe das so, dass dort der richtige Operator= noch fehlt.

    Ich habe probiert den operator= den er nutzt mit =delete zu löschen, was den Fehler verursacht, dass ich auf einen gelöschten Operator zugreife.

    Ich weiss nun nicht, wie ich das realisieren kann oder ob ich da an eine Grenze stoße. Wie gesagt, Setzen anhand vom Wert und anderen Element geht so, nur nicht das Abrufen.

    Vielen Dank für Hilfe

    Der Verzweifelte ^^



  • laut Fehlermeldung fehlt noch die Konvertierung von ObservedField zu LPCWSTR. Dein Getter gibt also nicht den Typ zurück, sondern ObservedField<Typ>.

    greetz KN4CK3R



  • hola

    spendiere deiner klasse noch nen konvertierungsoperator 'type'.

    Meep Meep



  • Hui 🙂 Danke für die Hilfe. Ich muss gestehen, ich wusste nicht, dass es Konvertierungsoperatoren gibt ^^.

    operator type() {
    	return this->onGet();
    }
    

    Dankeeeeee 🙂



  • Evtl. noch konstifizieren! 😮


Log in to reply