Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Getter und Setter mit Preprozessor

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
17.12.2006, 15:44 Uhr
(un)wissender
Niveauwart


Was meint ihr dazu? Erspart sehr viel Tipparbeit bei Standard-Getter/Setter.
Nachteil: Präprozessor, implizit inline.


C++:
#include <iostream>

//GS GetSimpleType
#define GS(name, type) public: type name() const { return m_##name; }
//GC GetComplexType
#define GC(name, type) public: type const& name() const { return m_##name; }
//SS SetSimpleType
#define SS(name, type) public: void name(type val) { m_##name = val; }
//SC SetComplexType
#define SC(name, type) public: void name(type const& val) { m_##name = val; }
//GSS GetSetSimpleType
#define GSS(name, type) GS(name, type) SC(name, type)
//GSC GetSetComplexType
#define GSC(name, type) GC(name, type) SC(name, type)

class Simple
{
public:
    Simple(int v) : m_v(v) {}
    GSS(v, int)  
private:
    int m_v;
} ;

class Complex
{
public:
    Complex(int v): m_s(v) {}
    GSC(s, Simple)
private:
    Simple m_s;
};  
    
int main()
{
    Simple s(3);
    std::cout << s.v() << '\n';
    s.v(4);
    std::cout << s.v() << '\n';
    Complex c(5);
    std::cout << c.s().v() << '\n';
    c.s(s);
    std::cout << c.s().v() << '\n';
}


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 17.12.2006 um 15:45 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.12.2006, 16:58 Uhr
0xdeadbeef
Gott
(Operator)


Ich halt das für nicht besonders sinnvoll. Wenn du eh direkten Zugriff auf die Variable erlauben willst, kannst du sie auch public machen, bei komplizierterer Logik schreibst du die Dinger nachher doch von Hand. Davon abgesehen...


C++:
class foo;

class foo {
private:
  GSS(baz)

  int m_baz; // Ups, da sind wir dann auf einmal public...
};


Makros sind gut darin, zu verschleiern, was wirklich passiert.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.12.2006, 17:31 Uhr
(un)wissender
Niveauwart



Zitat von 0xdeadbeef:

Wenn du eh direkten Zugriff auf die Variable erlauben willst, kannst du sie auch public machen[...]



Das stimmt ja so nicht, schau dir mal die Makros genau an. Kein Zugriff (ohne const cast).

Das mit dem public stimmt schon, könnte man dann auch rausnehmen.

Aber die Tipparbeit nervt mich schon.
--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 17.12.2006 um 17:31 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.12.2006, 12:33 Uhr
stephanw
localhorst


Ich halte das auch nicht für gut. Entweder als public erklären wenn Du sie so nutzen willst oder selbst schreiben. Wenn es Dir um die Tipp-Arbeit geht... man kann prima Scripte (oder VS-Macros ;-) schreiben, die Dir Klassen erzeugen. Darin kannst Du genau das unterbringen, was in Deinem Beispiel der Preprozessor macht.

Darüber hinaus läuft ein übermäßiges Nutzen von dummen get/set-Funktionen darauf hinaus, dass die Klasse nur als Daten-Halter benutzt wird und die zugehörige Logik woanders definiert wird. Das kann ein Entwurfsfehler sein. (Stichwort: "Tell, don't ask").
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.12.2006, 14:02 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich finde den Ansatz auch nicht gut. Ich finde den hier erwähnten alternativen Weg, einfach Attribute ebenfalls als public zu deklararieren ebenfalls schlecht:

selbst wenn die Getter/Setter höchst trivial sind, kann es sein, daß sie es in der Version 2 der Klasse nicht mehr sind. Hat man die Felder einmal public gemacht, müssen sie es im Sinne einer Kompatibilität auch bleiben. Das ist rein aus designsicht ziemlicher Müll.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.12.2006, 15:23 Uhr
ao

(Operator)


Ich stimme mal ein: Die Schreibarbeit hast du ein einziges Mal, aber mit schlechter Lesbarkeit oder mit Designfehlern ärgerst du dich selbst und andere unter Umständen jahrelang.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.12.2006, 17:24 Uhr
(un)wissender
Niveauwart


Hm, das public kann ja raus. Habe aber schon verstanden...
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


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: