einfache Methode erzeugt Fehler



  • Hallo, ich bin erst seit kurzem zu C++ getreten und lese mich zurzeit durch mehrere Tutorials.

    Nun bin ich ins Kapitel OOP gekommen und versuche, einfache Klassen zu erstellen.

    class Character    //Class.cpp
    {
        public:
        void SetHP();
    };
    
    void Character::SetHP()
    {
        cout << "Hallo";
    }
    

    Hier ergibt sich der Fehler.

    classes.cpp|34|multiple definition of `Character::SetHP()'|
    

    Aber laut verschiedenen Tuts sollte der Code gehen.
    Interne Deklaration klappt:

    class Character    //Class.cpp
    {
        public:
        void SetHP()
        {
            cout << "Hallo";
        }
    };
    

    Was mache ich falsch?



  • void Character::SetHP()
    {
        cout << "Hallo";
    }
    

    musst du raus aus der headerdatei machen und in die Character.cpp datei tun.



  • Ja, jetzt funktioniert es! Vielen Dank!



  • class Character    //Class.cpp
    {
        public:
        void SetHP();
    };
    

    "Class.cpp" -> vertippt?!
    Falls nicht, dann nimm dir das C++-Buch deiner Wahl und guck mal, wie man Header-Dateien nennt und wie die Source-Dateien...
    Und wenns gut ist, dein Buch, dann steht da auch noch, warum man das trennt - und es wäre auch noch beschrieben, wieso dein bsp. nich funktioniert hat...

    bb



  • unskilled schrieb:

    Und wenns gut ist, dein Buch, dann steht da auch noch, warum man das trennt

    oh, gute frage. ja, wenn das buch nicht offen zugibt, daß es nur ein relikt der c-compiler ist, die mit solchen tricks compilezeiten sparen sollten, sondern was von scoping faselt, kannste es der reinigenden kraft des feuers übergeben.



  • Der Kommentar war aus meinem Projekt, der hatte nichts mit dem Problem zu tun, war eine ganz andere Datei.
    Ich weiß schon, dass Headerdateien die Endung .h oder .hpp haben, wärend die Quelldateien .cpp, .cxx oder .cc haben. Mir war nur nicht klar, dass man Methoden nicht in die Headerdateien schreibt(es sei denn, intern in die Klassendefinition).

    Hab da noch eine Frage dazu:

    musst du raus aus der headerdatei machen und in die Character.cpp datei tun.

    Kann ich die Methode in eine andere Quelldatei machen und von der Hauptdatei ( mit main() ) darauf zugreifen? Ich habe es erst so versucht:

    classes.h
    main.cpp
    character.cpp

    classes.h:

    class Character
    {
        public:
        void SetHP()
    };
    

    main.cpp:

    #include "character.cpp"   // <-- hier
    
    Character Mark;
    
    int main()
    {
        Mark.SetHP();
        return 0;
    }
    

    character.cpp:

    #include "classes.h"
    
    void Character::SetHP()
    {
        cout << "Hallo";
    }
    

    Klappt so nicht, ergibt gleichen Fehler wie vorher...kann ich trotzdem die ganzen Methoden in andere Dateien auslagern?



  • [quote="Dbof"]

    #include "classes.h"   // <-- hier
    
    Character Mark;
    
    int main()
    {
        Mark.SetHP();
        return 0;
    }
    

    du sollst nur header-dateen inkludieren.
    daß mehrere cpp-dateien eine exe ergeben, ist sache des makefiles doer der IDE. das schreibst du nicht in c++ hin.



  • daß mehrere cpp-dateien eine exe ergeben, ist sache des makefiles doer der IDE. das schreibst du nicht in c++ hin.

    Ok, dankeschön!


Log in to reply