Probleme bei einer Kampfsimulation



  • Hallo noch mal!

    Es ist mir durchaus bewusst, dass man in einem Forum nicht sofort eine Antwort auf seine Fragen bekommt. Aber da ich hier ja sehe, dass praktisch dauerhaft neue Beiträge im Forum auftauchen, frage ich mich doch, ob ich vielleicht irgendwas falsch gemacht habe, dass keine Antwort kommt.

    Hätte ich für meine letzte Frage vielleicht einen neuen Thread machen sollen? Oder habe ich einfach zuviel geschrieben, so dass keiner Lust hat sich das alles durch zu lesen? 😉

    Versteht das jetzt bitte nicht falsch! Das ist auf keinen Fall ein Angriff oder sonst irgendwas in der Art! Ich bin begeistert von diesem Forum! Hier bekommt man so viele Informationen...

    Bloß habe ich ein wenig Angst, dass meine Problem einfach untergeht, da es ja bereits nach ein paar Stunden schon nur noch auf Seite 2 vorhanden ist.

    Gruß Spartaner



  • Naja, du weisst halt anscheinend ziemlich viele grundlegende Sachen nicht. z.B. dass switch bloss mit integralen Typen funktioniert, also "integers", also auch nicht mit Strings.

    Weiters solltest du in der Lage sein eine einfache Fehlermeldung selbst zu lesen - sonst wirst du nicht weit kommen ohne bei jeder 10. Zeile um Hilfe fragen zu müssen.

    "unresolved external 'c_basis::get_agility()'" zum Beispiel heisst schlicht und einfach dass du c_basis::get_agility nicht definiert hast, sonst müsste es der Linker ja finden.

    Kurz gesagt: du kannst nicht C++. Und dir C++ beizubringen ist wohl etwas viel verlangt für einen Thread wo es um Waffen und Raumschiffe geht.



  • Dein Codebeispiel ist auch sehr knapp gehalten (wie mein Vorredner gesagt hat, du hast wohl get_agility() nicht definiert, was wir aber nicht sehen können da du nicht den ganzen "relevanten" Code gepostet hast).

    Es müsste auch nicht

    cout << "Agility Ship 1: "  << get_agility() << endl;
    

    heißen, sondern

    cout << "Agility Ship 1: "  << ship1.get_agility() << endl;
    


  • hustbaer schrieb:

    Naja, du weisst halt anscheinend ziemlich viele grundlegende Sachen nicht. z.B. dass switch bloss mit integralen Typen funktioniert, also "integers", also auch nicht mit Strings.

    Spartaner schrieb:

    Ich gehe davon aus, dass die Probleme in irgendeiner Weise mit meinen includes zusammen hängen. Da ich auch einfach alles in die main.cpp kopiert hatte. Dort lief es ohne Probleme, wenn ich in der Schiffsklasse den Konstruktor entfernt habe. War dieser vorhanden, so bekam ich die Fehlermeldung, dass ich switch nicht mit string nutzen kann. Dies verstehe ich zwar nicht, aber damit könnte man ja noch leben.

    Wie ich bereits anfangs mehrfach gesgt habe, habe ich sehr lange nicht mehr programmiert, mehr als 3 Jahre nicht. Da kann man schonmal was vergessen. Nachdem ich das ganze in dem Visual C++ Express ausprobiert hatte, ist es mir auch aufgefallen, da dort die Fehlermeldung eindeutiger/besser zu verstehen war.

    hustbaer schrieb:

    Weiters solltest du in der Lage sein eine einfache Fehlermeldung selbst zu lesen - sonst wirst du nicht weit kommen ohne bei jeder 10. Zeile um Hilfe fragen zu müssen.

    Tut mir leid, aber so eine Aussage halte ich für absolut überflüssig! Dürfen hier im Forum also nur Leute Fragen stellen, die Informatik studiert haben und in einer großen Softwareschmiede arbeiten?

    hustbaer schrieb:

    "unresolved external 'c_basis::get_agility()'" zum Beispiel heisst schlicht und einfach dass du c_basis::get_agility nicht definiert hast, sonst müsste es der Linker ja finden.

    Spartaner schrieb:

    Da ich auch einfach alles in die main.cpp kopiert hatte. Dort lief es ohne Probleme,...

    So, wenn du richtig gelesen hättest, wüsstest du, dass ich die Funktionen definiert hätte. Warum sollte es sonst funktionieren, wenn alles in der main.cpp sitzt und nicht auf die verschiedenen Dcteien aufgeteilt ist.

    hustbaer schrieb:

    Kurz gesagt: du kannst nicht C++. Und dir C++ beizubringen ist wohl etwas viel verlangt für einen Thread wo es um Waffen und Raumschiffe geht.

    Ich weiß nicht was du für Probleme hast. Aber in einem Forum kommen auch mal Fragen von Leuten die nicht programmieren konnten wie sie geboren wurden, sondern dies erst mal lernen müssen. Und dass du mir C++ beibringen sollst, habe ich auch nicht verlangt!

    @Chris++

    Die Ausgabe der Werte über cout ist von mir nur ein Tippfehler. Da ich nicht auf diesem Rechner programmieren sondern auf meinem Laptop. Da musste ich es neu schreiben.

    Und wie bereits gesagt, gehe ich davon aus, dass es mit den #includes zusammenhängt, da es ja funktioniert, wenn alles in der main.cpp ist.

    Aber hier noch mal das Beispiel, wie die funktionen definiert sind.

    // c_ship.cpp
    
    // ....
    
    c_ship::set_agility(int i_agi)
    {
       // ...
    
       m_agility = i_agi;
    }
    
    c_ship::get_agility()
    {
       return m_agility;
    }
    


  • Spartaner schrieb:

    So, wenn du richtig gelesen hättest, wüsstest du, dass ich die Funktionen definiert hätte. Warum sollte es sonst funktionieren, wenn alles in der main.cpp sitzt und nicht auf die verschiedenen Dcteien aufgeteilt ist.

    Warum funktioniert es denn dann nicht, wenn Du die Funktionen in einer im Projekt eingebundenen Datei definiert hättest?

    Mit den Includes hat das i.d.R. wenig zu tun, da der Linker sich um Includes garnicht schert. Ist denn die Datei c_ship.cpp auch im Projekt eingebunden? (Nicht nur im selben Ordner!)



  • Spartaner schrieb:

    hustbaer schrieb:

    "unresolved external 'c_basis::get_agility()'" zum Beispiel heisst schlicht und einfach dass du c_basis::get_agility nicht definiert hast, sonst müsste es der Linker ja finden.

    Spartaner schrieb:

    Da ich auch einfach alles in die main.cpp kopiert hatte. Dort lief es ohne Probleme,...

    So, wenn du richtig gelesen hättest, wüsstest du, dass ich die Funktionen definiert hätte. Warum sollte es sonst funktionieren, wenn alles in der main.cpp sitzt und nicht auf die verschiedenen Dcteien aufgeteilt ist.

    Der Linker durchsucht aber nicht die gesamte Festplatte nach seinen Funktionen - der nimmt sich nur die LIBs vor, die du ihm mitgegeben hast (und ein paar ausgewählte Standard-Bibliotheken). Das heißt, wenn du dein Programm auf mehrere CPPs verteilt hast, mußt du alle zusammen an den Compiler und Linker übergeben.
    (im MSVC sollten eigentlich alle CPP-Dateien im aktiven Projekt mitgelinkt, wenn du anfängst zu compilieren)



  • Wäre da nicht ein Returntyp angebracht? Und wenn nicht warum nicht?



  • Zunächst mal möchte ich mich dafür entschuldigen, falls mein vorheriger Post etwas zu hart rüber gekommen ist. Allerdings bin ich bei solchen Antworten immer ein wenig "genervt"!

    @ CStoll & LordJaxom: Ich habe da so viel rumprobiert und geändert, dass ich nicht mit Sicherheit sagen kann, dass bei dieser Fehlermeldung die c_ship.cpp wirklich im Projekt eingebunden war. Da bin ich mir einfach nicht mehr sicher! Das werde ich direkt nochmal ausprobieren. Allerdings hatte ich ja auch noch das Problem mit den strings (nicht im switch).

    Spartaner schrieb:

    Außerdem habe ich auch in der Basisklasse ein string deklariert. Dort bekomme ich auch eine Fehlermeldung, dass string ein unbekannter Bezeichner wäre (wenn ich mich richtig erinnere) und halt ein Variablentyp angegeben werden muss.

    So, nochmal rausgesucht...
    Kann dieses Problem evtl. damit zusammenhängen, dass ich die string.h ja in mehreren Dateien eingebunden habe? (s.o.)
    In der Zwischenzeit werde ich nochmal ein neues Projekt anlegen und dort alle zum Projekt gehörenden cpp einfügen. Und zusätzlich den Konstruktor mit einer if-Abfrage ausstatten.



  • Es heisst nicht <string.h> sondern <string> - zumindest wenn du das File der Standard Library meinst 😉
    Und du kannst die inkludieren so oft du willst, da sind "include guards" drin, das darf nix machen.

    Grundsätzlich... versuch mal alle "using namespace" wegzulassen, und überall std::string (bzw. std::vector, std::sort etc.) zu schreiben.
    Und überall wo du einen std::string verwendest muss natürlich auch vorher <string> inkludiert worden sein (entweder direkt oder indirekt).



  • Was die Fehlermeldung angeht: Schau nach, daß du

    a) den Prototypen der Funktion im Header der Ship-Klasse deklariert

    b) den Funktionskörper im Quellcode als zu Ship gehörig gekennzeichnet

    hast.

    Also:

    Ship.h

    class Ship
    {
     public: 
       getAgility();
    }
    

    Ship.cpp

    Ship::getAgility()
    {
     // do Stuff
    }
    


  • hustbaer schrieb:

    Es heisst nicht <string.h> sondern <string> - zumindest wenn du das File der Standard Library meinst

    ähmm, natürlich meine ich die <string> und nicht die <string.h> 😃

    Jetzt funktioniert alles einwandfrei! 🙂
    Also lag es wahrscheinlich nur daran, dass ich in der c_basis.hpp nicht using namespace std; eingegeben habe. Somit konnte er string ja nicht erkennen. Hätte ich dort einfach std::string eingegeben, dann hätte es auch funktioniert oder? Jetzt hab ich aber auf jeden Fall das using rausgenommen und über std:: genutzt.

    Vielen Dank für die Hilfe!!!

    Und nochmal wegen meiner vorherigen Frage wegen meiner Prioritätenliste. Was ist dieses double dispatching und, falls ihr es verstanden habt 😉 , ist meine vorgehensweise sinnvoll oder geht es besser?

    Gruß Spartaner



  • Double Dispatch heisst, daß die aufgerufene Methode eines Objekts nicht nur anhand des Objekttyps bestimmt wird, sondern auch anhand des Argumenttyps der Methode.

    Siehe auch http://www.eli.sdsu.edu/courses/spring03/cs535/notes/dispatch/dispatch.html


Anmelden zum Antworten