Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Ideen & Projekte » Properties für C++

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
30.07.2005, 10:55 Uhr
(un)wissender
Niveauwart


Wenn jemand das Property-Konzept in C# kennt, dann weiß er, was ich versuche, in C++ zu implementieren. Ein erster Ansatz sieht so aus:

Um Werte auszulesen und zuzuweisen, gibt es einen Accessor. Der kann als template-Argument angepasst werden, damit der Benutzer des Property eigene Logik zum setzen und auslesen der Variable, die das Property kapselt, hinzufügen kann.
Der DefaultAccessor tut nichts, außer den Wert zu liefern oder ihn zu setzen.


C++:
/Für getter und setter die mehr Logik haben, default wird nichts extra getan.
template<typename T>
class DefaultAccessor
{
public:
    //getter
    const T operator()(const T value) const
    {
        return value;
    }
      
    //setter        
    void operator()(T & value, const T assignValue)
    {
        value = assignValue;
    }  
};



So sieht die Signatur eines Property aus.
ValueType ist der Varibalentyp, bspw ein int. HasSetter sagt aus, ob der Wert der Variablen nur gelesen oder auch gesetzt werden kann. Der Accessor sollte klar sein.

C++:
//Die Signatur der property-Klasse.
template
<
    typename ValueType,
    bool HasSetter = true,  
    template <typename T> class Accessor = DefaultAccessor
>
class property
{
};  



Spezialisieren von property für HasSetter=true.


C++:
template <typename ValueType, template <typename T> class Accessor>
class property<ValueType, true, Accessor>
{
public:
    explicit property(const ValueType value)
        : m_value(value)
    {
    }    
    
    //setter    
    property operator=(const ValueType value)
    {
        Accessor<ValueType>()(m_value, value);
        return *this;      
    }
    
    //getter
     operator const ValueType() const
     {      
         return Accessor<ValueType>()(m_value);
     }
                
     private:
         ValueType m_value;
              
};  



Spezialisieren von property für HasSetter=false.

C++:
template <typename ValueType, template <typename T> class Accessor>
class property<ValueType, false, Accessor>
{
public:
    explicit property(const ValueType value)
        : m_value(value)
    {
    }    
      
    //getter
     operator const ValueType() const
     {      
         return Accessor<ValueType>()(m_value);
     }
                
     private:
         ValueType m_value;
              
};  



Eine Kleine Testklasse mit einem einfach int-Property:

C++:
class PropertyTest
{
    public:
        PropertyTest(int test)
        :  Test0(test)
        {
        }    
        
       property<int> Test0;    
};  



Die main zum testen:

C++:
int main()
{
    PropertyTest test(9);  
    std::cout << "\nTest0 (Primitive with setter and without accessor):\n";
    std::cout <<  test.Test0 << '\n';
    test.Test0 = 7;
    std::cout << test.Test0 <<'\n';



Was meint ihr dazu? Habt ihr Verbesserungsvorschläge, Ideen oder glaubt ihr, dass ist alles überflüssig?
Ein Problem stellen noch die komplexen Datentypen dar, die zu oft kopiert werden. Da müßte man wohl noch weitere template-Spezialisierungen einführen, vermutet ich mal.

Ich finde das Konzept toll, weil man sehr schnell Variablen dekarieren kann, ohne ewig getter und setter schreiben zu müssen. Die Benutzung ist auch einfacher als immer setter und getter aufrufen zu müssen.

Speichertechnisch gibt es keinen Overhead und Performanz sollte auch optimal sein (für primitive Datentypen).
--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 30.07.2005 um 11:00 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.07.2005, 16:03 Uhr
Tommix



Hallo,
also ich kenn C# nicht, aber erreicht man nicht haargenau das Gleiche, wenn man die Variable public macht? Die Kapselung liefer so doch vollen Zugriff, oder?
(Ist eine Verständnisfrage, keine Kritik.)

- Tommix

--
10
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.07.2005, 17:16 Uhr
(un)wissender
Niveauwart


Nein, man gibt die Variable nicht nach außen, es sieht nur so aus. Ist das gleiche wie mit getter und setter, nur schöner verpackt (meine Meinung).
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
31.07.2005, 08:46 Uhr
Tommix



'Morgen,
das was ich meinte, trifft auf getter/setter genau so zu.

C++:
class foo
{
public:
    foo() {}
    ~foo {}
    int get () const {return bar;}
    void set (int foobar) {bar = foobar;}
private:
    int bar;
};


bringt gegenüber

C++:
class foo
{
public:
    foo() {}
    ~foo {}
    int bar;
};


doch keinen echten Hub. Die Kapselung ist, wenn keine Prüfung auf Gültigkeitsbereich oder so was in der Art erfolgt, doch ein purer Formalismus, oder?

- Tommix

--
9
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
31.07.2005, 10:23 Uhr
(un)wissender
Niveauwart


Doch das hilft. Du kannst nämlich dem Getter bzw. Setter neuen code hinzufügen ohne den anderen Quellcode ändern zu müssen. Da sgeht bei direktem Zugang der Variablen nicht.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
26.08.2005, 14:24 Uhr
Th



Hallo (un)wissender,

habe erst jetzt diesen Thread entdeckt und deine Templates sind super.

Da man häufig bei Properties nur die setter-Methode mit extra Code versieht, müßte man bei deiner Impl. jedoch immer neue template-Klassen von DefaultAccessor ableiten (oder neu schreiben). Wie wäre es, wenn man explizit noch Member-Funktionen dem template mitgeben kann, um die setter-Logik zu erweitern?

So etwas ähnliches habe ich für unser internes PropertySystem (bei der Spieleentwicklung) auch programmiert...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
26.08.2005, 17:36 Uhr
(un)wissender
Niveauwart


Oh, schön dass das jemand gut findet.
Das mit den Member-Funktionenhabe ich auch schon überlegt, das Problem ist nur, dass dadurch Overhead entsteht und nicht zu knapp. (Speicherung der Pointer + des Objektes)
Und ein Grundsatz war, dass Properties keinen zustätzlichen Overhead zu der normalen getter/setter + Variablen-Syntax beinhalten.
Und einen Accessor zu schreiben ist ja nicht wild, die Funktionsobjekte für die STL musste auch schreiben. Der Aufwand ist wohl identisch. Statt des Accessors müßte man ansonsten die Getter und Setter schreiben, das ist auch Aufwand.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Ideen & Projekte ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: