Klassen



  • Hallo,
    ich möchte gerne ein Objekt anlegen der Klasse TBaugrundstück und dies soll die Eigenschaften der Klasse TGrundstück ebenfalls annehmen.

    Ich bekomme immer die Fehlermeldung:

    [C++ Fehler] Main.cpp(30): E2285 Keine Übereinstimmung für 'TBaugrundstueck::TBaugrundstueck(int,int,char *,char *,int)' gefunden
    

    Dabei sollte es doch 'TBaugrundstueck::TBaugrundstueck(float,int,char *,char *,int)' sein.

    Hier nun der Quelltext:
    main.cpp

    int main(int argc, char* argv[])
    {
     TBaugrundstueck X(5000,3400,"300","Lagerhalle",999000);
     X.Ausgabe3();
     getch();
     return 0;
    }
    

    TGrundstueck.cpp

    #include <iostream.h>
    #include <conio.h>
    #include <vcl.h>
    #pragma hdrstop
    #include "TGrundstueck.h"
    #pragma package(smart_init)
    //******************************************************************************
    TGrundstueck::TGrundstueck()
    {
     wert=100;
     flaeche=0;
     beschreibung=NULL;
     flurstueck=NULL;
    }
    //******************************************************************************
    TGrundstueck::TGrundstueck(float flaeche1, char *flurstueck1, char *beschreibung1, float wert1)
    {
     setflaeche(flaeche1);
    
     flurstueck=new char[strlen(flurstueck1)+1];
     strcpy(flurstueck,flurstueck1);
    
     beschreibung=new char[strlen(beschreibung1)+1];
     strcpy(beschreibung,beschreibung1);
    
     setwert(wert1);
    }
    //******************************************************************************
    //Dekonstruktor
    TGrundstueck::~TGrundstueck()
    {
     delete [] flurstueck;
     delete [] beschreibung;
    }
    //******************************************************************************
    //Setter und Getter
    void TGrundstueck::setflaeche(float flaeche1)
    {
     flaeche=flaeche1;
    }
    //******************************************************************************
    float TGrundstueck::getflaeche()
    {
     return flaeche;
    }
    //******************************************************************************
    void TGrundstueck::setwert(float wert1)
    {
     wert=wert1;
    }
    //******************************************************************************
    
    float TGrundstueck::getwert(void) const
    {
     return wert;
    }
    //******************************************************************************
    int TGrundstueck::Ausgabe()
    {
     return wert;
    }
    void TGrundstueck::Ausgabe2(void) const
    {
     cout<<"\n";
     cout<<"Flurstueck: "<<flurstueck<<"\n";
     cout<<"Beschreibung: "<<beschreibung<<"\n";
     cout<<"Flaeche: "<<flaeche<<"\n";
     cout<<"Wert: "<<wert<<" Euro\n";
     cout<<"\n";
    
    }
    

    TGrundstueck.h

    #ifndef TGrundstueckH
    #include "TObjekt.h"
    #define TGrundstueckH
    //---------------------------------------------------------------------------
    #endif
    class TGrundstueck: public TObjekt
    {
     public:
     TGrundstueck();  //Klassen Konstruktor
     TGrundstueck::TGrundstueck(float,char *,char *,float);
     ~TGrundstueck();   //Klassen Dekonstruktor
     int Ausgabe();
     void Ausgabe2() const;
     private:
      int wert;
      float flaeche;
      char* flurstueck;
      char* beschreibung;
      void setflaeche(float);
      float getflaeche();
      void setwert(float);
      float getwert(void) const;
    };
    

    TBaugrundstueck.cpp

    #include <vcl.h>
    #include <iostream.h>
    #include <conio.h>
    #pragma hdrstop
    #include "TGrundstueck.h"
    #include "TBaugrundstueck.h"
    
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    
    TBaugrundstueck::TBaugrundstueck()
    {
     bauland=0;
    }
    
    TBaugrundstueck::TBaugrundstueck(float bauland1):TGrundstueck(flaeche1, flurstueck1, beschreibung1, wert1)
    {
     setbauland(bauland1);
    }
    
    TBaugrundstueck::~TBaugrundstueck()
    {
    
    }
    
    int TBaugrundstueck::Ausgabe()
    {
     return TGrundstueck::Ausgabe()+100;
    }
    //******************************************************************************
    //Setter und Getter
    void TBaugrundstueck::setbauland(float bauland1)
    {
     bauland=bauland1;
    }
    //******************************************************************************
    float TBaugrundstueck::getbauland()
    {
     return bauland;
    }
    //******************************************************************************
    void TBaugrundstueck::Ausgabe3(void) const
    {
     cout<<"\n";
     cout<<"Bauland: "<<bauland<<"\n";
     cout<<"\n";
    }
    

    TBaugrundstueck.h

    #ifndef TBaugrundstueckH
    #define TBaugrundstueckH
    //---------------------------------------------------------------------------
    #endif
    class TBaugrundstueck:public TGrundstueck
    {
    public:
     TBaugrundstueck();
     TBaugrundstueck(float): TGrundstueck(float, char *,char *,float);
     ~TBaugrundstueck();
     int Ausgabe();
     void Ausgabe3() const;
    private:
      float bauland;
      void setbauland(float);
      float getbauland();
    };
    

    Ich glaube ich habe einen Fehler bei der Vererbung gemacht, bekomme den aber nicht raus.
    Könnt ihr mir helfen ?
    Vielen Dank



  • Kurz vorweg, habe den Code nur überflogen...

    Dabei sollte es doch 'TBaugrundstueck::TBaugrundstueck(float,int,char *,char *,int)' sein. gefunden

    Wieso das denn? Der Compiler beschwert sich doch über den falschen Kostrukturaufruf in main(). Und dieser lautet nunmal so wie in der Fehlermeldung.

    D.h. wenn dann sollte der Ctor Aufruf doch so lauten:

    TBaugrundstueck X(float_value)
    

    Und du solltest in diesem Konstruktur auch noch den Basisinitialisierer entfernen oder dem Konstruktur auch für den Basisinitialisierer noch entsprechende Parameter geben.

    Caipi



  • Aber ich sage ihm doch:

    class TBaugrundstueck:public TGrundstueck 
    { 
    public: 
     TBaugrundstueck(); 
     TBaugrundstueck(float): TGrundstueck(float, char *,char *,float); 
    ...
    

    und in der Main rufe das auf mit :
    TBaugrundstueck X(5000,3400,"300","Lagerhalle",999000);



  • versuchs vielleicht mal mit

    TBaugrundstueck X(5000.0,3400,"300","Lagerhalle",999000);
    

    er sagt ja eben, dass es keinen konstruktor mit nem int als erstes argument gibt. du willst aber einen konstruktor aufrufen, der ein int als erstes argument hat...



  • Mike_2004 schrieb:

    Aber ich sage ihm doch:

    class TBaugrundstueck:public TGrundstueck 
    { 
    public: 
     TBaugrundstueck(); 
     TBaugrundstueck(float): TGrundstueck(float, char *,char *,float); 
    ...
    

    Und funktioniert es bei dir? Der eine Ctor in TBaugrundstueck sollte imho so ähnlich lauten:

    TBaugrundstueck::TBaugrundstueck(float x, float y, char* str1, char* str2, float z ) : TGrundstueck(y, str1, str2, z)
    {
          setbauland(x);
    }
    

    lauten. So rufst du nämlich den Basisinitialisierer auch mit korrekten Parametern auf.

    und in der Main rufe das auf mit :
    TBaugrundstueck X(5000,3400,"300","Lagerhalle",999000);

    Jetzt kannst du in main() auch dies schreiben.

    Schau dir am besten nochmal ein paar Seiten zu den Themen Vererbung insbesondere Basisinitialisierer an.

    MamboKurt schrieb:

    versuchs vielleicht mal mit

    TBaugrundstueck X(5000.0,3400,"300","Lagerhalle",999000);
    

    er sagt ja eben, dass es keinen konstruktor mit nem int als erstes argument gibt. du willst aber einen konstruktor aufrufen, der ein int als erstes argument hat...

    Das tut AFAIK nichts zur Sache.

    Caipi


Anmelden zum Antworten