Probleme mit Makro zur Definion von "Getter/Setter-Paaren".



  • Hallo,

    ich wollte mir ein Makro schreiben, mit dem ich die Definition von GetXyz() und SetXyz() abkürzen kann. Leider macht der Kompiler nicht mit :-(. Also, folgendes habe ich versucht:

    /// Macro that can be used for definitions of a getter/setter method pair.
    #define PROPERTY_DEFINITION(PropName, PropType, MemberVariable) \
    inline const PropType& GetPropName() const      { return MemberVariable; }; \
    inline void SetPropName(const PropType& value)  { MemberVariable = value; };
    // ...
    class AClass
    {
    private:
        std::string m_name;
        int         m_age;
    public:
        PROPERTY_DEFINITION(Name, std::string, m_name)
        PROPERTY_DEFINITION(Age,  int,         m_age)
    

    Hiermit klappt das für die einmalige Verwendung, bei der zweiten Zeile (Age) sagt er, dass 'GetPropName' bereits definiert wurde mit anderem Rückgabetyp. Ok, dass kann ich einsehen, dann erkennt der Präprozessor den Identifier PropName nicht mehr wenn es nicht als einzelnes Wort steht.

    Dann habe ich versucht, GetPropName und SetPropName zu trennen, was aber auch fehlschlug (slber Fehler):

    #define PROPERTY_DEFINITION(PropName, PropType, MemberVariable) \
    inline const PropType& Get\
    PropName() const      { return MemberVariable; }; \
    inline void Set\
    PropName(const PropType& value)  { MemberVariable = value; };
    

    Eigentlich auch logisch, denn er erkennt ja den Zeilenumbruch nicht und alles ist, wie gehabt... Aber wie kann ich dass denn dann machen? Das muss doch irgendwie gehen.

    Ich wäre eigentlich auch dankbar für eine ganz andere Lösung, denn defines find ich eigentlich grauenhaft (wg. Debugging, Code-Vervollständigung, etc.).



  • probiers mal so

    #define PROPERTY_DEFINITION(PropName, PropType, MemberVariable) \ 
    inline const PropType & Get##PropName() const      { return MemberVariable; }; \ 
    inline void Set##PropName(const PropType & value)  { MemberVariable = value; };
    

    mfg



  • Das war einfach. Danke 🙂


Anmelden zum Antworten