Init-Liste Konstruktor



  • Hallo miteinander ich hätte eine Frage zu folgenden Code
    B(char *IStr1) : Str1(IStr1) {};
    C(char *IStr1, char *IStr2) : B(IStr1), StrC (IStr2) {};
    D(char *IStr1, char *IStr2, char *IStr3) : C(IStr1, IStr2), StrD

    Was bewirken diese Konstruktoren??

    Vielen Dank für eure Hilfe!

    #include <iostream>
    #include <iomanip>
    #include <string.h>
    #include <math.h>
    #include <stdlib.h>

    using namespace std;

    class A
    {
    public:
    virtual void Func1() = 0;
    };

    class B : public A
    {
    private:
    char * StrB;
    public:
    B(char *IStr1) : Str1(IStr1) {};
    virtual void Func1();
    };
    class C : public B
    {
    private:
    char *StrC;
    public:
    C(char *IStr1, char *IStr2) : B(IStr1), StrC (IStr2) {};
    virtual void Func1();
    };

    class D : public C
    {
    private:
    char *StrD;
    public:
    D(char *IStr1, char *IStr2, char *IStr3) : C(IStr1, IStr2), StrD(IStr3){};
    virtual void Func1();
    };

    void B::Func1()
    {
    cout << StrB << endl;
    }

    void C::Func1()
    {
    cout << StrC << " ";
    B::Func1();
    }

    void D::Func1()
    {
    cout << StrD << " ";
    C::Func1();
    }

    int main()
    {
    A * Avec[3];
    B b("Hello"), *b_ptr = &b;
    C c("Test", "Hi"), *c_ptr = &c;
    D d("XYZ", "to", "Welcome"), *d_ptr = &d;
    //(1)

    Avec[0] = b_ptr;
    Avec[1] = c_ptr;
    Avec[2] = d_ptr;

    for (int i = 0; i < 3; i++)
    Avec[i]->Func1();
    return 0;
    }


  • Mod

    Sie setzen die Werte der Member?

    Was genau ist dir denn unklar?



  • Ich hab noch nen Fehler gefunden des muss
    B(char *IStr1) : StrB(IStr1) {}; heißen nicht
    B(char *IStr1) : Str1(IStr1) {}; da ja Str1 kein Member von B ist

    des bedeutet jetzt das der StrB mit dem Zeiger IStr1 initialisiert wurde?

    Wies kann ich des nicht im Rumpf realisieren?

    B()
    {
    char *IStr1;
    StrB = IStr1;
    }


  • Mod

    matzehilto schrieb:

    des bedeutet jetzt das der StrB mit dem Zeiger IStr1 initialisiert wurde?

    Es wird der Konstruktor von StrB mit dem Argument IStr1 aufgerufen. Da es sich bei Str1 um einen eingebauten Datentyp handelt (hier char *), bedeutet das einfach, dass StrB den Wert IStr1 annimmt. Bei eigenen Klassen kann im Konstruktor aber durchaus komplexeres passieren.

    Wies kann ich des nicht im Rumpf realisieren?

    Das kannst du schon machen. Aber warum erst den Standardkonstruktor und hinterher den Zuweisungsoperator aufrufen, wenn ein einfacher Aufruf des richtigen Konstruktors das gewünschte Ergebnis ohne Umweg bringt?

    edit: Und noch ein Stichwort zum Thema, dass dir anscheinend fehlt: Initialisierungsliste



  • Zitat:
    Es wird der Konstruktor von StrB mit dem Argument IStr1 aufgerufen.

    Wie kann ein Konstruktor von StrB aufgerufen werden? Des ist doch nur ein Zeiger vom Typ char?

    Ich hab des jetzt verstanden das des besser ist mit der Initialisierungsliste zu machen.

    Danke für deine Hilfe!!
    Bin noch blutiger Anfänger und eigentlich Elektrotechniker und kein Informatiker muss jedoch zwangsläufig des ganze drauf haben, da im Januar ne Info Klausur ansteht.


  • Mod

    matzehilto schrieb:

    Wie kann ein Konstruktor von StrB aufgerufen werden? Des ist doch nur ein Zeiger vom Typ char?

    Erwischt 🙂
    Du hast natürlich Recht, dass die eingebauten Datentypen keinen richtigen Konstruktor haben. Aber sie bieten aus Konsistenzgründen genau die gleiche Syntax wie eine richtige Klasse mit Konstruktor an. In diesem Fall erfolgt dann einfach eine Zuweisung.



  • Okay ich denk so einigermaßen hab ich des jetzt verstanden.

    Nochmals DANKE!


Anmelden zum Antworten