[Anfängerfrage] Initialisierung von mehrdeutiger geerbter Variable



  • Hallo,

    ich bin gerade dabei mir das Thema Vererbung reinzuziehen und bin jetzt, nachdem ich damit etwas rumprobiert habe, auf ein kleines Problem gestoßen. Und zwar mekert der Compiler, dass die Variable mehrdeutig ist (ist auch Absicht). Im Konstrukter hat dafür Klassenname::Variablenname gereicht. In der Initialisierungsliste funktioniert das aber weiß Gott wieso nicht. Wie muss ich da vorgehen?

    [cpp]
    
    class CKlasse0
    {
    protected:
    	int i1;
    public:
    	CKlasse0() : i1(17) { std::cout << "Beginn Klasse0" << std::endl; }
    	~CKlasse0(){ std::cout << "Ende Klasse0" << std::endl; }
    	void test0();
    };
    
    class CKlasse1
    {
    protected:
    	int i1;
    public:
    	CKlasse1() : i1(5) { std::cout << "Beginn Klasse1" << std::endl; }
    	~CKlasse1(){ std::cout << "Ende Klasse1" << std::endl; }
    	void test1();
    	void test2();
    };
    
    class CKlasse2 : public CKlasse1, public CKlasse0
    {
    public:
    	void test3();
    	void test4();
    	CKlasse2() : CKlasse1::i1(23) { /*CKlasse1::i1 = 23*/ ; std::cout << "Beginn Klasse2" << std::endl; }
    	~CKlasse2(){ std::cout << "Ende Klasse2" << std::endl; }
    };
    [/cpp]
    

    Das was ich auskommentiert habe funktioniert. In der Initialiserungsliste kommt jedoch die Meldung i1 sei keine Memberklasse von CKlasse1. Nur der Grund dafür will mir nicht klar werden.



  • Du kannst in einer Initialisierungsliste nur direkte Basisklassen-Konstruktoren oder aber direkte Member der eigenen Klasse initialisieren.

    Du müßtest also für Klasse1 einen überladenen Konstruktor (mit 'int'-Parameter) zur Verfügung stellen und dort dann folgendermaßen initialisieren:

    CKlasse2() : CKlasse1(23) { ... }
    

    P.S. Laß mal das 'C' bei den Klassennamen weg...



  • Ok, danke. Nur noch mal damit ich das auch richtig verstanden habe, du meinst:

    CKlasse1(int i) { i1 = i; }
    CKlasse2() : CKlasse1(23) { }
    


  • warum nicht so??

    CKlasse1(int i) : i1(i)  {}
    


  • Gucky schrieb:

    warum nicht so??

    CKlasse1(int i) : i1(i)  {}
    

    Gute Frage, da hatte ich wohl eine Denkblockade.^^



  • Genau, das meinte ich (natürlich mit der Änderung von Gucky 😉



  • Gibts da nen Unterschied ausser weniger zu schreiben und übersichtlicher?

    class Klasse0
    {
    protected:
        int i1;
    public:
        Klasse0() : i1(17) {}
        Klasse0(int i) : i1(i) {}
    };
    
    class Klasse1
    {
    protected:
        int i1;
    public:
        Klasse1(int i=17) : i1(i) {}
    };
    

Anmelden zum Antworten