returned 1



  • Guten Abend,

    ich habe ein Problem.
    Und zwar habe ich mir ein kleines Fragment geschrieben, womit ich die Vererbung testen wollte. Nun bekomm ich vom Compiler die Meldung: Id returned 1 exist status. und einen Fehler wegen eines undefinierten Verweises auf Tier.

    Ich habe bereits gelesen ,dass Id sich auf den Linker bezieht und auch der undefinierte Verweis etwas damit zutun haben könnte. Das was mich stocken lässt ist allerdings das ich nicht linke, außer wenn man so will die inkludierten Module.

    Hat wer ein paar Worte?

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    
    string getName(string name){
    
    cin >> name;
    
        return name;
    }
    
    class Tier {
    
    public :
    
    string name;
    
    string getName();
    
    };
    
    
    class Hund : public Tier {
    
     public:
     void stimme(){
    
     cout << "wau, wau" << endl;
    
            }
    };
    
    
    int main(){
    
    Hund lessi;
    
    lessi.stimme();
    lessi.getName();  // Erbe
    
    cout << lessi.name << endl; // Erbe
    
    
    
    return 0;
    }
    
    Danke Lou
    


  • @Lou-Cyphr3 sagte in returned 1:

    Nun bekomm ich vom Compiler die Meldung: Id returned 1 exist status. und einen Fehler wegen eines undefinierten Verweises auf Tier.

    Copy-Paste der Meldung! Eher unwahrscheinlich, dass sich der Linker über Existenzstatus zurückgibt...

    Dein Code compiliert hier durch. Allerdings fehlt Tier::getName (aber das benutzt du auch nicht, deswegen gehts ohne Linker-Fehler)

    Edit: jetzt hast du nachträglich deinen Code geändert und meine Antwort passt nicht mehr. Dennoch fehlt Tier::getName immer noch.



  • Wo ist Tier::getName() definiert?



  • /tmp/ccHuKP9O.o: In Funktion »main«:
    classsss.cpp:(.text+0x7b): Warnung: undefinierter Verweis auf »Tier::getNameabi:cxx11«
    collect2: error: ld returned 1 exit status
    

    Sorry ich hatte ursprünglich das veränderte Script hochgeladen, jetzt geändert.
    die getName() wird von Hund lessi benutzt.



  • @Lou-Cyphr3 Ja, aber du hast keine solche Funktion. Du hast nur ein getName, aber kein Tier::getName.



  • @wob muss ich die Definition direkt in die Klasse schreiben?



  • nein



  • @wob dann ist die Vererbung falsch?



  • nein.

    Wie wär's, wenn du nicht rätst, sondern feststellst, wo der Unterschied zwsichen getName und Tier::getName ist.



  • @wob Ich weiß nicht recht. Ich nahm an, dass wenn die Funktion definiert ist, ich sie in der Klasse nutzen kann. Den Bereichsoperatur haben wir mal bei OperatorenPriorität erwähnt aber tatsächlich noch nicht behandelt. Namespaces kommen erst in ein paar Wochen.
    Ich habe aber gerade gelesen, ihn zur Methodendeklaration außerhalb der Klasse zu benötigen. Oi!



  • @Lou-Cyphr3 Woher soll der Compiler wissen, dass dein getName zu Tier gehört? Es könnte ja auch zu Hund oder zu sonstwas gehören. Wenn keine Klassenname dabei steht, handelt es sich um eine stinknormale freie Funktion - und die gehört zu gar keiner Klasse! Sie wird auch so nicht funktionieren, weil dein Parameter "name" so keine Verbindung zu der Variable "name" des Tiers hat.

    class Tier {
      void meine_funktion();
    };
    
    Tier::meine_funktion() {
    // ...
    }
    

    So. Hilft das?

    Den oberen Teil (das class { .... };) schreibt man auch oft in eine .h-Datei, wenn man die Klasse anderswo braucht. Die eigentliche Implementierung gehört dann in die cpp-Datei.



  • @wob okay macht Sinn. Danke.

    Ich hab das jetzt mal übertragen.

    class Tier {
    
    public :
    
    string name;
    
    void getName();
    
    };
    
    Tier::void getName(){
    
    cin >> name;
    
        return name;
    }
    
    

    Der Compiler meckert.

    classsss.cpp:16:8: error: expected unqualified-id before ‘void’
    Tier:: void getName(){
    ^~~~
    


  • @Lou-Cyphr3 sorry, hatte in der Eile das void vergessen.

    void Tier::name_der_funktion()
    

    Rückgabetyp bzw void an den Anfang!



  • Okay. tausend Dank! @wob


Anmelden zum Antworten