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!


Log in to reply