Externe Klasse richtig einbinden, wie ?

  • C++

  • Mr Crown
  • 2868 Aufrufe 8 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Externe Klasse richtig einbinden, wie ?

    Ich bin im Moment dabei mich mit Klassen in C++ zu beschäftigen.
    Jetzt bin ich an dem Punkt, andem es drei verschiedene Dateien gibt, die aus Hauptprogramm, Klassendeklaration und Definition der Methoden besteht.
    Wie kann ich jetzt alle drei Dateien korrekt linken ?
    Habe schon viel bei google und in Büchern gesucht, habe es aber noch nicht genau hinbekommen.
    Beispiel:

    Klassendeklaration

    Quellcode

    1. class meine Klasse
    2. {
    3. meine Klasse(int a);
    4. public:
    5. void meine Methode();
    6. private:
    7. int meine Variable;
    8. };


    Klassendefinition:

    Quellcode

    1. #include "meine Klasse.h"
    2. meine Klasse::meine Klasse(int a):
    3. meine Variable (a)
    4. { }
    5. int meine Klasse::meine Methode()
    6. {
    7. //tut irgendwas
    8. }


    Hauptprogramm:

    Quellcode

    1. #include <iostream>
    2. //irgendwo müsste ich jetzt meine Klasse einbinden
    3. using namespace std;
    4. int main()
    5. {
    6. //bla bla, auf die klasse zugreifen usw.
    7. return 0;
    8. }


    Ich wäre für jede Hilfe dankbar.

    Mit freundlichen Grüßen

    Mr Crown
  • So wie du es im Moment hast dürfte es auch nen compiler error geben...

    PHP-Quellcode

    1. class meine Klasse {
    ist keine gültige Definition.... der Klassenname muss ein Wort sein, leerzeichen sind nicht erlaubt. Zum beispiel so:

    PHP-Quellcode

    1. class meineKlasse {


    um die Klasse benutzen zu können musst du nur die header datei in der main.cpp hinzufügen

    PHP-Quellcode

    1. #include <iostream>
    2. #include "meineKlasse.h"
    3. using namespace std;
    4. int main()
    5. {
    6. meineKlasse meins = new meineKlasse(5);
    7. //bla bla, auf die klasse zugreifen usw.
    8. delete meineKlasse;
    9. return 0;
    10. }
    Alles anzeigen
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Danke erstmal. Ok das war ein zu schnell erstelltes Beispiel, das mit dem Leerzeichen im Klassennamen steht nicht in meinem original Code.
    Ich stelle mich glaube ich immer noch zu blöd an, denn ich bekomme immer noch einen "[Linker error] undefined reference to 'meine Klasse::meineKlasse(int)'".
    Also ich habe die "meineKlasse.h" in die "main.cpp" und in die "meineKlasse.cpp", in der die Klassendefinition steht, eingebunden. Wenn ich jetzt die "main.cpp" kompilliere bekomme ich den besagten Linker error.
    Was mache ich falsch ?
  • Ok :

    soldier.h:

    PHP-Quellcode

    1. #include <iostream>
    2. using namespace std;
    3. class soldier
    4. {
    5. public:
    6. soldier(int startHealth, int startStrenght);
    7. int increaseHealth();
    8. int decreaseHealth ();
    9. int decreaseStrenght();
    10. int increaseStrenght();
    11. int fHealth();
    12. int fStrenght();
    13. private:
    14. int Health;
    15. int Strenght;
    16. };
    Alles anzeigen


    soldier.cpp:

    PHP-Quellcode

    1. #include "soldier.h"
    2. soldier::soldier(int startHealth, int startStrenght):
    3. Health (startHealth),
    4. Strenght (startStrenght)
    5. {}
    6. int soldier::increaseHealth()
    7. {
    8. Health ++;
    9. return Health;
    10. }
    11. int soldier::decreaseHealth ()
    12. {
    13. Health --;
    14. return Health;
    15. }
    16. int soldier::decreaseStrenght()
    17. {
    18. Strenght --;
    19. return Strenght;
    20. }
    21. int soldier::increaseStrenght()
    22. {
    23. Strenght ++;
    24. return Strenght;
    25. }
    26. int soldier::fHealth()
    27. {
    28. return Health;
    29. }
    30. int soldier::fStrenght()
    31. {
    32. return Strenght;
    33. }
    Alles anzeigen


    main.cpp

    PHP-Quellcode

    1. #include <iostream>
    2. #include <string>
    3. #include <conio.h>
    4. #include "soldier.h"
    5. using namespace std;
    6. int main()
    7. {
    8. string spieler1, spieler2;
    9. cout<<"Bitte geben Sie einen Namen fuer Spieler 1 ein: ";
    10. cin>> spieler1;
    11. soldier sp1(5, 3);
    12. cout<<"Bitte geben Sie einen Namen fuer Spieler 2 ein: ";
    13. cin>> spieler2;
    14. soldier sp2(5, 3);
    15. getch();
    16. return 0;
    17. }
    Alles anzeigen


    Das ist jetzt nicht der gesamte Code, das wäre zu lang, aber bei diesem kleinen Teil bekomme ich die gleiche Fehlermeldung, wenn ich in main.cpp einen soldier erstellen will.
  • Ich habe jetzt einfach mal in der main.cpp das "#include "soldier.h"" durch
    "#include "soldier.cpp"" ersetzt, also statt der Klassendeklaration die Definition in die main.cpp eingebunden. Erstaunlicherweise hat das geklappt. Aber irgendwo habe ich mal gelesen, dass man keine ".cpp" per "#include" einbinden soll. Finde ich sehr merkwürdig. Naja, es klappt ja vorläufig.
    Vielen Dank für deine Hilfe Zerd

    Übrigens ich verwende Dev C++ von bloodshed.

    Mit freundlichen Grüßen

    Mr Crown
  • Halllo Mc_Crown,

    wenn der Bloodshed mit "#include soldier.cpp" durchläuft, hast Du wahrscheinlich beim einbinden der "soldier.h" einen Fehler (Schreibfehler, anderes Verzwichniss, nicht ins Projekt hinzugefügt ...).

    soldier.h stellt quasi die Verbindung zwischen den beinden .cpp-Dateien her.
    Bloodshed war auch meine erste IDE, mit der ich auch ein größeres Projekt erstellt habe, muß also funktionieen.
    Hast Du im Projekt-Erstellen-Dialog Konsolenanwendung angewählt?? DevC++ ist da schon etwas eigen ... Und der MingGW-Compiler, der da drunter steckt verhält sich nach ANSI-Standard ...

    Grüße,

    zeroNULL

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von zeroNULL ()

  • Danke zeroNULL.
    Jetzt habe ich den Fehler gefunden. Ich hatte die Dateien vorher einfach nur im selben Ordner. Jetzt erst habe ich mal ein neues Projekt erstellt die 3 Dateien dem hinzugefügt, mit dem Resultat: es läuft alles wunderbar. Großartig.
    Viele Dank.

    Mit freundlichen Grüßen

    Mr Crown