C++ Frage zur Vererbung



  • MFK schrieb:

    Ich sehe da veraltete Headerdateien und fehlende runde Klammern bei der Definition von Man::drinkBeer.

    Habs getestet, das ist der Fehler!

    mfg



  • 10 C:\temp\human.hpp base `Human' with only non-default constructor in class without a constructor

    Ich denke er meint den.



  • Naja ich bin mir jetzt nicht so sicher ob die Fehlermeldungen euch wirklich helfen. Die sehen ja bei jeden Complier anderst aus. Ich arbeite mit linux g++3.3
    Deswegen hab ich es weg gelassen. Das mit den runden Klammern hab ich jetzt geaendert. Aber ich bekomme immer noch folgenden Fehler:

    g++ -o programm programm.cpp human.cpp
    In file included from programm.cpp:2:
    human.hpp:10: error: base Human' with only non-default constructor in class without a constructor In file included from human.cpp:2: human.hpp:10: error: baseHuman' with only non-default constructor in class
    without a constructor

    Vielleicht sagt euch das jetzt mehr.



  • Du rufst denn Constructor der Human-Basisklasse in der Man-Class nicht auf! Vielleicht liegts daran?



  • Da Man von Human abgeleitet ist muss in Man ein Konstruktor bereitstehen der dann ja auch ein Human Objekt erzeugen kann.

    Da du in Man keinen Konstruktor hast erzeugt dein Compiler automatisch sowas:

    Man();
    

    also einen Default Konstruktor und da Man von Human abgeleitet ist muss sowas da stehen(hoffe mal das ich jetzt nichts falsches sage):

    Man():Human();
    

    Das heißt wenn ein Man Objekt erzeugt wird muss auch ein Human Objekt erzeugt werden. Aber leider gibt es in Human keinen:

    Human();
    

    Default-Konstruktor sondern nur den hier:

    Human(int age);
    

    Das heißt dann das in Man etwas sein muss um so einen Konstruktor anzusprechen. Und da macht man es dann so:

    Man(int age):Human(age);
    

    Du stellst in Man diesen Konstruktor zur Verfügung der dann das int age weiter "nach oben" zu Human reicht und somit Human(int age) ansprechen kann 😃 😃



  • bzw. die Man-klasse hat garkeinen Konstruktor
    -> der Compiler strickt sich den default-Ctor für Man selbst, indem er für die Basisklasse und alle Member den default-Ctor aufruft
    Die Basisklasse hat keinen Default-Ctor --> großes Dilemma.



  • Ok, danke fuer die Tips. Jetzt habe ich es hinbekommen.

    Noch eine Frage zu den Header / Libs Datein.
    Ist es sinnvoll, oder ueberhaupt moeglich, die class Man in extra Dateien also z.B. man.hpp / man.cpp zu legen? Ich hab mir gedacht das alles schoen aufgeraeumt ist und man jede Klasse in separate Files schreibt. Bei so einem kleinen Programm ist es natuerlich nicht noetig. Aber fuer groessere Sachen?

    Danke und Gruss Neal



  • Hi!

    Für größere Projekte ist es bestimmt sehr nützlich, weil du dann genau weißt wo welcher Quellcode ist.



  • Ja, ok. Aber wie.

    Wie kann ich der man.hpp sagen das sie von human.hpp erbt?

    Ich bekomme folgenden Fehler beim uebersetzten. Irgendwie ist mir das schon klar das es so nicht geht. Aber ich weiss auch nicht wie ich es richtig machen kann.

    Fehlermeldung:
    neal@client01:~/cpp/human$ g++ -o programm programm.cpp human.cpp man.cpp
    In file included from man.hpp:1,
    from programm.cpp:3:
    human.hpp:2: error: redefinition of class Human' human.hpp:2: error: previous definition ofclass Human'

    #include <iostream.h> // human.cpp
    #include "human.hpp"
    
    Human::Human(int age) {
      itsAge = age;
    }
    
    int Human::getAge() {
      return(itsAge);
    }
    
    // human.hpp
    class Human {
      public:
        Human::Human(int);
        int getAge();
    
      protected:
        int itsAge; 
    };
    
    #include <iostream.h> // man.cpp
    #include "man.hpp"
    
    Man::Man(int age) : Human(age){
      itsAge = age;
    }
    
    void Man::drinkBeer() {
      cout << "Hicks\n";
    }
    
    #include "human.hpp" // man.hpp
    
    class Man: public Human {
      public:
        Man(int);
        void drinkBeer();
    };
    
    #include <iostream.h> // programm.cpp
    #include "human.hpp"
    #include "man.hpp"
    
    int main() {
      Human hans(10);
      Man franz(20);
    
      cout << hans.getAge() << "\n";
      cout << franz.getAge() << "\n";
    
      franz.drinkBeer();  
    
      return(0);
    }
    


  • Such mal nach include guards.
    Kurt



  • Ich hab folgenden LInk gefunden. Der scheint mir vielversprechend zu sein.
    Da werd ich mich jetzt mal durchkämpfen.

    http://userpage.fu-berlin.de/~ram/pub/pub_jf47hxhHHt/c++_getrennte_uebersetzung_de

    Danke und Gruss Neal


Anmelden zum Antworten