Frage zu Memberinitialisierung

  • Hallo! Ich bin gerade dabei, mir ein paar gtkmm-Tutorials anzusehen und bin auf ein paar Zeilen C++-Code gestoßen, die ich (mangels Erfahrung in dieser Sprache) nicht wirklich ganz verstehe:

    hier die Klassendefinition:

    Code
    class HelloWorld : public Gtk::Window
    {
    public:
    HelloWorld();
    virtual ~HelloWorld();
    protected:
    virtual void on_button_clicked();
    Gtk::Button m_button;
    };



    und hier das interessante codestück:

    Code
    HelloWorld::HelloWorld() [color=magenta]: m_button ("Test")[/color]
    /*: m_button("Hello World") // creates a new button with the label "Hello World".
    {*/
    {
    set_border_width(10);
    m_button.signal_clicked().connect(sigc::mem_fun(*this, &HelloWorld::on_button_clicked));
    add(m_button);
    m_button.show();
    }



    und zwar verstehe ich den rosa markierten teil nicht ganz.. hier wird irgendwie die membervariable initialisiert, aber gibt es dazu keine andere äquivalente schreibweise (edit: ich meine eine im methodenrumpf anwendbare)? habe so was bisher noch nicht gesehen, und meine 2 c++-bücher schweigen sich darüber auch aus..

    lg michi

  • Zitat von michi204


    und zwar verstehe ich den rosa markierten teil nicht ganz.. hier wird irgendwie die membervariable initialisiert, aber gibt es dazu keine andere äquivalente schreibweise

    Das ist nicht nur irgendwie sondern _die_ Initialisierung. Das da nach dem Doppelpunkt ist die Initialisierungsliste, da schreibt man quasi alle Member und ihre Initialisierungswerte rein.

    Code
    HelloWorld::HelloWorld() : /* <-- ab hier dann */

    Wenn du das nicht so magst, hindert dich natürlich auch keiner dran, das so zu schreiben (edit: es sei denn das GTK, das kenne ich nicht):

    Code
    HelloWorld::HelloWorld() 
    {
       m_button = Gtk::Button ("Hallo Welt.");
    }

    Allerdings solltest du beachten, dass alle Variablen in C++, bevor ihnen so ein Wert zugewiesen wird, _irgendeinen_ Inhalt haben. Wenn du vor dieser Zeile irgendwas mit dem m_button machen willst, ist das dann eben böse und es kann zu Inkonsistenzen kommen. Daher verwendet man eben die Initalisierungsliste, weil vor der garantiert nix anderers mit den Membern gemacht wird.

  • danke für die info, ich werde mir wohl neue c++-literatur besorgen müssen :rolleyes:

    Zitat von Irrlicht

    Wenn du das nicht so magst, hindert dich natürlich auch keiner dran, das so zu schreiben (edit: es sei denn das GTK, das kenne ich nicht):

    ja, das tut es auch... das hatte ich sogar schon probiert, jedoch macht mir button.h einen strich durch die rechnung. es ist wohl schon so gedacht, wie ich es im beispiel gefunden habe..

    lg michi

  • Wenn man z.B. Referenzen oder sonstige Typen ohne Zuweisungsoperator als Member hat, dann ist die Initialisierungsliste die einzige Möglichkeit, diesen Dingen einen Wert zuzuweisen.

  • Zitat von Ringding

    Wenn man z.B. Referenzen oder sonstige Typen ohne Zuweisungsoperator als Member hat, dann ist die Initialisierungsliste die einzige Möglichkeit, diesen Dingen einen Wert zuzuweisen.

    ich glaube in meinem fall ist der zuweisungsoperator private..

    lg michi

  • Man sollte aber von vornherein darauf achten, dass die Reihenfolge der Initialisierung mit der Reihenfolge im Headerfile übereinstimmt, sonst meckert gcc mit der Option -Wall.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!