Konstruktor & Vererbung



  • Hi,
    ich hab ein Problem mit meinem C++ Programm und komme gerade gar nicht weiter.
    Kann mir da jemand bitte helfen ich bin grade echt am verzweifeln 😞

    Das sind meine Erros:

    sparschwein.h(6): error C2011: 'Sparschwein': 'class' Typneudefinition
    sparschwein.h(6): Siehe Deklaration von 'Sparschwein'
    buntessparschwein.h(8): error C2504: 'Sparschwein': Basisklasse undefiniert
    quelle.cpp(12): error C2079: 's1' verwendet undefiniertes class 'Sparschwein'
    quelle.cpp(17): error C2228: Links von ".einwerfen" muss sich eine Klasse/Struktur/Union befinden.
    quelle.cpp(18): error C2228: Links von ".printGuthaben" muss sich eine Klasse/Struktur/Union befinden.
    buntessparschwein.h(16): error C2512: 'Sparschwein': Kein geeigneter Standardkonstruktor verfügbar

    #include <iostream>
    #include "Sparschwein.h"
    #include "BuntesSparschwein.h"
    using namespace std;
    
    int main() 
    { 
    
    	Sparschwein s1(1.0f); 
    	BuntesSparschwein s2(2.0f, 35 ,35 ,35) ; 
    	//SprechendesSparschwein s3(3.0f, " May the force be with you "); 
    
    	cout << " ---- Schwein 1 ----" << endl ; 
    	s1.einwerfen(5.0f); 
    	s1.printGuthaben(); 
    	cout << " ---- Schwein 2 ----" << endl ; 
    	s2.printColor(); 
    	cout << " ---- Schwein 3 ----" << endl ; 
    	//s3. einwerfen (10.0f); 
    	//s3. sprich (); 
    
    	/* 
    	Sparschwein s4; 
    
    	cout << "---- Schweineaddition ----" << endl ; 
    	s4 = s1 + s2; 
    	s1. printGuthaben (); 
    	s2. printGuthaben (); 
    	s4. printGuthaben (); 
    	*/ 
    
    	system (" PAUSE "); 
    	return 0; 
    }
    

    Sparschwein.cpp

    #include <iostream>
    #include <string> 
    #include "Sparschwein.h"
    using namespace std; 
    
    //Einwerffunktion Sparschwein
    int Sparschwein::einwerfen(float in)
    { 
            guthaben += in; 
    	cout << "Du hast " << guthaben<< " Euro in dein Sparschwein geworfen" <<endl; 
    	return 0; 
    }; 
    
    //Sparschwein Guthaben Ausgabe
    int Sparschwein::printGuthaben()
    { 
    	cout << "In deinem Sparschwein sind nun "<< guthaben << " Euro" <<endl; 
            return 0; 
    };
    
    Sparschwein::~Sparschwein() 
    { 
    }
    

    Sparschwein.h

    #include <iostream> 
    using namespace std; 
    #include <string> 
    
    class Sparschwein
    { 
    protected: 
    	float guthaben;
    
    public: 
    Sparschwein (float guthaben)
     : guthaben(guthaben)
    { 
    } 
    	~Sparschwein(); 
    	int einwerfen(float in); 
    	int printGuthaben(); 
    
    };
    

    Sparschwein.cpp

    #include <iostream>
    #include <string> 
    #include "BuntesSparschwein.h"
    using namespace std; 
    
    int BuntesSparschwein::printColor()
    { 
    	cout << r << g << b <<endl; 
    
    	return 0; 
    };
    

    BuntesSparschwein.h

    #include <iostream> 
    using namespace std; 
    #include <string> 
    #include "Sparschwein.h"
    
    class BuntesSparschwein : public Sparschwein
    { 
    protected: 
    	float guthaben; 
    
    public: 
    	int r,g,b;
    	BuntesSparschwein (float guthaben, int r, int g, int b)
    	: guthaben(g), r(r), g(g), b(b)
    { 
    }
    	int printColor(); 
    };
    


  • Du benutzt keine Include Guards daher wird deine Sparschwein Klasse zweimal definiert. Einmal durch das #include "Sparschwein.h" in der quelle.cpp und einmal über die BuntesSparschwein.h wo noch ein Include steht. Du musst ein #pragma once an den Anfang deiner Header Dateien packen (ja ich weiß ist nicht Standard, kann aber effektiv jeder vernünftige Compiler). Oder wenn du Standardkonform bleiben möchtest müssen die Header ein

    #ifndef MY_HEADER_HPP
    #define MY_HEADER_HPP
    ...
    #endif
    

    Konstruk kriegen. Google am Besten mal nach Include Guard.



  • Hallo,

    als erstes solltest du dir Include-Guards anschauen.

    buntessparschwein.h(16): error C2512: 'Sparschwein': Kein geeigneter Standardkonstruktor verfügbar

    Der Fehler sagt eigentlich klar was los ist:
    Um ein BuntesSparschwein zu erzeugen, muss zunächst der Konstruktor der Basisklasse Sparschwein aufgerufen werden.
    Wenn du dem Kompiler in der Initialisierungsliste nichts sagst, nimmt er den Standardkonstruktor (den es nicht (mehr -wegen eigenem Konstruktor) gibt).

    Unabhängig von den Fehlern noch mal googeln, warum float für 'Geld' schlecht ist und warum using namespace in Headern nicht gut ist und warum Destruktoren in Basisklassen virtual oder protected sein sollten.

    ps: guthaben in Sparschwein und Buntessparschwein willst du mit Sicherheit nicht haben.



  • Super danke 🙂

    jetzt habe ich nur folgendes Problem:

    Er nimmt jetzt immer den Standardkonstruktor. Ich möchte aber einen Wert übergeben.

    Sparschwein.h

    ...
    class BuntesSparschwein : public Sparschwein
    { 
    protected: 
    	float guthaben; 
    
    public: 
    	int r,g,b;
    	BuntesSparschwein (float gut, int x, int y, int z)
    	{
    		guthaben=gut;
    		r=x;
    		g=y;
    		b=z;
    	}
    ...
    

    Sparschwein.h

    ...
    class Sparschwein
    { 
    protected: 
    	float guthaben;
    
    public: 
    	Sparschwein()
    	{
    		guthaben=0;
    	}
    	Sparschwein (float gut)
    	{
    		guthaben=gut;
    	}
    	~Sparschwein(); 
    	int einwerfen(float in); 
    	int printGuthaben(); 
    
    };
    

    und Quelle.cpp

    ...
    BuntesSparschwein s2(1.0f, 35 ,35 ,35) ;
    ...
    


  • Welchen Standarkonstrutor nimmt "er"?
    Woher weisst du das?
    Dir ist schon klar, dass du in Buntes... zwei verschiedene Guthaben hast?



  • Du musst einfach wie Jockelx es bereits gesagt hat, den Konstruktor der Basisklasse in der Initialisierungliste deines abgeleiteten Konstruktors aufrufen. Dann kannst du dort auswählen, welcher Konstruktor aus der Basisklasse tatsächlich benutzt wird, da ansonsten einfach der Default-Konstruktor benutzt wird.
    Google mal nach "Initialisierungsliste Konstruktor".

    Für dein Beispiel könnte es etwas so aussehen:

    BuntesSparschwein (float gut, int x, int y, int z) : Sparschwein(gut)
        {
            guthaben=gut;
            r=x;
            g=y;
            b=z;
        }
    


  • Repeater schrieb:

    Google mal nach "Initialisierungsliste Konstruktor".

    Für dein Beispiel könnte es etwas so aussehen:

    BuntesSparschwein (float gut, int x, int y, int z) : Sparschwein(gut)
        {
            guthaben=gut;
            r=x;
            g=y;
            b=z;
        }
    

    Wenn shcon Initialisierungsliste, dann bitte auch konsequent!


Anmelden zum Antworten