Problem mit Konstruktoraufruf



  • hi,

    ich möchte über ein objekt der abgeleiteten klasse den konstruktor der basisklasse aufrufen aber irgendwie klappt das nicht so ganz.

    beim ersten objekt zur basisklasse kommt 10 raus. beim objekt zur abgl. klassen ebenfalls wobei 40 rauskommen sollte.

    hab mal in den debugger geschaut und er springt auch in die basiskonstr. und weißt den variablen die 10 zu aber beim rücksprung in die abgl. klasse hab ich wieder 1,2,3,4 in den variebalen stehen...

    irgendeine idee woran das liegt?

    danke und gruß

    #include <iostream>
    using namespace std;
    
    class viereck 
    {
    private:
    	int a,b,c,d;
    public:
    	viereck(int w=1, int x=2, int y=3, int z=4)
    	{
    		a=w;
    		b=x;
    		c=y;
    		d=z;
    	}
    	int umfang()
    	{
    		return a+b+c+d;
    	}
    };
    
    class quadrat : public viereck 
    {
    public:
    	quadrat(int t=5)
    	{
    		viereck(t,t,t,t);
    	}
    };
    
    int main ()
    {
    	viereck abc;
    	cout << abc.umfang() << endl;
    	quadrat xyz(10);
    	cout << xyz.umfang() << endl;
    }
    


  • class quadrat : public viereck 
    {
    public:
      quadrat(int t=5)
        :  viereck(t,t,t,t)
      {
      }
    
    };
    


  • danke, so gehts.

    aber was mich interessiert ( will dabei auch was lernen 🙂 ) was denn der unterschied ist zwischen den 2 aufrufen. bei mir im anweisungsblock und bei dir durch das :

    quadrat(int t=5)
        {
            viereck(t,t,t,t);
        }
    
    quadrat(int t=5)
        :  viereck(t,t,t,t)
      {
      }
    


  • das ist eine initialisierungsliste...
    schaue dazu hier: http://tutorial.schornboeck.net/initliste.htm



  • Das hinter dem Doppelpunkt nennt sich "Initialisierungsliste", da kann man Variablen der Klasse direkt mit Werten initialisieren... zB wenn du eine Objekt einer Klasse, die keinen Standardkonstruktor hat, in deiner Klasse hast, dann musst du ja einen anderen Konstruktor aufrufen.
    Die Variablen in der Initialisierungsliste werde in der Reihenfolge, in der sie in der Klassendefinition stehen, initialisiert!



  • Genau gesagt, hast du bei deinem Aufruf den Defaultkonstruktor von Viereck bei der Initialisierung von Quadrat aufgerufen und dann innerhalb dieses Konstruktors eine lokale unbenannte Instanz von Viereck erzeugt. Einen Konstruktor kann man so nicht direkt aufrufen.



  • vielen dank für eure tipps und erklärungen!


Anmelden zum Antworten