Membervariablen initialisieren, wenn sie den selben namen wie konstruktor-parameter haben
-
Hallo,
wie der titel schon sagt möchte ich die parameter meines konstruktors genauso nennen wie membervariablen. Ist das irgendwie möglich?
Soll ungefähr so aussehen:
class UART { public: UART( uint8_t deviceID ); private: uint8_t deviceID; }; UART::UART( uint8_t deviceID ) : deviceID( deviceID ) { }
-
vielleicht nur mit einem :: vor dem variablennamen
-
probiers doch einfach aus.
-
Das geht genau so wie du es geschrieben hast, da Parameter Membervariablen verdecken. Wenn du auf die Membervariable zugreifen willst, schreib einfach this-> davor.
U.a. aus diesem Grund verwenden wohl viele Leute eine besondere Notation für Membervariablen, z.B. m_member oder member_.
-
naja mit dem this in der init-list kommen warnings, aber jetzt hab ich das mir auch mal angeguckt und es geht einfach mit UART::deviceID.
-
Ähh ich weiß jetzt nich was ich für drogen genommen habe, aber den quatsch mit UART:: kannst du in die tonne treten. Es kompiliert doch ganz einfach so mit dem gleichen namen, und der wertt ist an ende auch jesetzt,
-
class UART { public: UART(uint8_t); private: uint8_t deviceID; }; UART::UART(uint8_t deviceID) : deviceID(deviceID) { this->deviceID += 1; // hier musst du this davor setzen, da er sonnst wahrscheinlich dem Parameter Vorrang geben würde. }...
-
Das wollten wir dir doch die ganze Zeit sagen, das es auch ohne "this->" und "UART::" geht:)
-
Hallo nochmal,
vielen Dank für eure zahlreichen Antworten.
Hab das ganze jetzt auch mal im Linux mit gcc ausprobiert, da klappt es wunderbar.
Bisher hatte ich es immer nur mit meinem ARM-ELF-GCC gemacht, da das Programm für eben einen solchen ARM-Mikrocontroller gedacht ist.
Dort bekam ich immer eine warningsrc/led_gpio.cpp: In constructor ‘LED_GPIO::LED_GPIO(uint32_t*, uint8_t, bool)’: src/led_gpio.cpp:5: warning: declaration of ‘isActivelow’ shadows a member of 'this'und dachte deshalb es müsste auch eine "schöne" Lösung dafür geben.
Aber wenn sich alle einig sind, dasses so gemacht wird, werde ich es dabei belassen.Danke für die Hilfe!
-
Die Warnung ist ja auch richtig. Im Rumpf des Konstruktors ist deine membervariable nur noch zugaenglich, wenn du sie Qualifizierst.
class UART { public: UART(uint8_t); private: uint8_t deviceID; //deklaration des Members }; UART::UART(uint8_t deviceID) //hier kriegt der Parameter den gleichen Namen! : /*das hier ist klarerweise das member, da es in de init-list steht*/deviceID (deviceID)//es wird aber mit dem Parameter initialisiert { deviceID += 1; //hier ueberdeckt der Parameter den member (=> Compilerwarnung), deshalb this->deviceID += 1; //muss der member mit this-> qualifiziert werden UART::deviceID += 1; //oder mit dem Bereichsoperator }Sollte das ganze klar machen. Aber wie schon gesagt wurde: besser fuer member etwas unterschiedliche Namen nehmen, damits nicht ganz so unschoen zu lesen/schreiben ist