Weltraumvernichtungssimulator



  • Ah, okay jetzt hab ich endlich mal den sinn davon verstanden. Wenn irgend n Dödel z.B. "3324 45345" eingibt, dann würde immer ein Rest im Buffer stehen, und der wäre dann beim nächsten "cin" dabei, und dann würds wieder nicht gehen......

    So aber noch die andere Frage, ich verstehe nicht warum hier ein "cin", also in der Konsole so eine Eingabeaufforderung aufgerufen wird:

    #include <iostream>
    #include <limits>
    
    int main()
    {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    

    ???

    Und was ich auch nicht ganz verstehe, warum hast du bei dem letzten Beispiel "std::flush" verwndet, das nutzt man doch glaub wenn man den Computer zwingen will alles sofort aus dem zwischen buffer von "cout" auf den Bildschirm zu schreiben. Aber in was für Fällen genau wendet man das an? War das jetzt in deinem Fall wichtig, weil ich wäre da nie draufgekommen das jetzt zu verwenden.

    MfG
    Stromberg



  • Noch was, ich wollte das jetzt so ganz professionel machen, und hab mein Code so in verschiedene Headers unterteilt. (Modulare Programmierung?)
    Ich hab eine "game.hpp" mit der Deklaration der Klasse "game" und eine "game.cpp" mit der Definition der Klasse "game". Bist jetzt müsste noch alles stimmen. So, dann wollte ich noch eine Header Datei namens "Operators.hpp" machen mit der Deklaration der Operatoren (hab bis jetzt zwar erst einen überladen, aber vll. werdens ja noch mehr). Und einen namens "Operators.cpp" mit der Defintion der Operatoren. Ist das sinnvoll und übersichtlicher wenn ich die Operatoren auch noch in einen Header stecke, oder eher unsinn? Hier mal die 4 Errors:

    -------------- Build: Debug in GAME ---------------
    Compiling: operators.cpp
    In file included from operators.cpp:1:
    operators.hpp:4: error: expected constructor, destructor, or type conversion before '&' token
    operators.hpp:4: error: expected `,' or `;' before '&' token
    operators.cpp:3: error: expected constructor, destructor, or type conversion before '&' token
    operators.cpp:3: error: expected `,' or `;' before '&' token
    Process terminated with status 1 (0 minutes, 0 seconds)
    4 errors, 0 warnings
    

    Am Code kanns nicht liegen, weil der ging vorhin noch, als alles in einer Datei war.
    Hier der Code:

    main.cpp

    #include "game.hpp"
    #include "operators.hpp"
    using namespace std;
    
    int main()
    {
        game wus;
        wus.new_story(game::part("Wer wollen sie sein?\n",
                      "1. Hitler\n","2. Gahndi\n","3. Georg W. Bush\n",
                      "Sie sind nun Hitler!\n", "Sie sind nun Gahndi!\n", "Sie sind nun Georg W. Bush!\n"));
        wus.set_story(0);
    
        return 0;
    }
    

    game.hpp

    #ifndef INCLUDE_GAME_HPP
    #define INCLUDE_GAME_HPP
    
    #include <vector>
    #include <string>
    #include <limits>
    
    class game
    {
        public:
    
        game();
        ~game();
        struct part
        {
            std::string m_question, m_a, m_b, m_c, m_effect[3];
            part(const std::string& question_,const std::string& a_,const std::string& b_,const std::string& c_,
                 const std::string& effect1_,const std::string& effect2_,const std::string& effect3_);
        };
        inline void new_story(const part& data) {m_story.push_back(data);}
        void set_story(size_t index);
        friend std::ostream& operator<< (std::ostream& out, const game::part& data);
    
        private:
        std::vector<part> m_story;
        const std::string message;
    
    };
    
    #endif // GAME_HPP_INCLUDED
    

    game.cpp

    #include <iostream>
    #include "game.hpp"
    
    game::game()
    :message("Du bist doch Deutschlands d\x81mmster! Ist es so schwierig eine Zahl zwischen\n1 und 3 einzugeben?"
             + std::string(" Probiers nochmal du Arschloch!\n"))
    {
    
    }
    
    game::~game()
    {
    
    }
    
    game::part::part(const std::string& question_,const std::string& a_,const std::string& b_,const std::string& c_,
                     const std::string& effect1_,const std::string& effect2_="",const std::string& effect3_="")
    :m_question(question_),m_a(a_),m_b(b_),m_c(c_)
    {
        m_effect[0]=effect1_;
        m_effect[1]=effect2_;
        m_effect[2]=effect3_;
    
    }
    
    void game::set_story(size_t index)
    {
        std::cout << m_story[index];
        unsigned short save;
        while(!(std::cin >> save) || (save>3) || (save<1))
        {
            std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            std::cout << message;
        }
        if (m_story[index].m_effect[1].empty() == true && m_story[index].m_effect[2].empty() == true)
        {
            std::cout << m_story[index].m_effect[0];
            return;
        }
        std::cout << m_story[index].m_effect[save-1];
    }
    

    operators.hpp

    #ifndef OPERATORS_HPP_INCLUDED
    #define OPERATORS_HPP_INCLUDED
    
    std::ostream& operator<< (std::ostream& out, const game::part& data);
    
    #endif // OPERATORS_HPP_INCLUDED
    

    operators.cpp

    #include "operators.hpp"
    
    std::ostream& operator<< (std::ostream& out, const game::part& data)
    {
        out << data.m_question << data.m_a << data.m_b << data.m_c;
        return out;
    }
    

    MfG
    Stromberg



  • du musst noch innerhalb von operators.hpp #include <iostream> am anfang einfügen. Bislang hast du das nur in der game.cpp stehen. Das Problem ist, dass der Compiler jede übersetzungseinheit(=cpp datei) einzeln betrachtet, in der main.cpp gelten also die deklarationen von game.cpp nicht.

    oder einfacher ausgedrückt:

    #ifndef OPERATORS_HPP_INCLUDED
    #define OPERATORS_HPP_INCLUDED
    
    std::ostream& operator<< (std::ostream& out, const game::part& data);
    

    wenn das der anfang deines projektes wäre, woher sollte der compiler wissen, was std::ostream ist?



  • Ach so, mh ich hab immer gedacht wenn irgendwo im Code die include Datei vorkommt dann würde diese gleich für alle gelten?
    Na ja zumindestens hab ich jetzt <iostream> und auch noch "game.hpp" eingefügt.
    Ich hab immer gedacht das wäre schlechter Stil wenn man überal die gleichen include Datein hat....na ja wieder was gelernt.

    #ifndef OPERATORS_HPP_INCLUDED
    #define OPERATORS_HPP_INCLUDED
    
    #include <iostream>
    #include "game.hpp"
    
    std::ostream& operator<< (std::ostream& out, const game::part& data);
    
    #endif // OPERATORS_HPP_INCLUDED
    

    MfG
    Stromberg

    ZUSATZ:
    Jetzt ist meine vorletzte Frage leider auf Seite 4 verschuwnden:

    gerichtet @ (D)Evil, oder jemand der halt auch weiß um was es geht.

    Ah, okay jetzt hab ich endlich mal den sinn davon verstanden. Wenn irgend n Dödel z.B. "3324 45345" eingibt, dann würde immer ein Rest im Buffer stehen, und der wäre dann beim nächsten "cin" dabei, und dann würds wieder nicht gehen......

    So aber noch die andere Frage, ich verstehe nicht warum hier ein "cin", also in der Konsole so eine Eingabeaufforderung aufgerufen wird:

    #include <iostream>
    #include <limits>
    
    int main()
    {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    

    ???

    Und was ich auch nicht ganz verstehe, warum hast du bei dem letzten Beispiel "std::flush" verwndet, das nutzt man doch glaub wenn man den Computer zwingen will alles sofort aus dem zwischen buffer von "cout" auf den Bildschirm zu schreiben. Aber in was für Fällen genau wendet man das an? War das jetzt in deinem Fall wichtig, weil ich wäre da nie draufgekommen das jetzt zu verwenden.

    MfG
    Stromberg



  • Und was ich auch nicht ganz verstehe, warum hast du bei dem letzten Beispiel "std::flush" verwendet, das nutzt man doch glaub wenn man den Computer zwingen will alles sofort aus dem zwischen Buffer von "cout" auf den Bildschirm zu schreiben. Aber in was für Fällen genau wendet man das an? War das jetzt in deinem Fall wichtig, weil ich wäre da nie drauf gekommen das jetzt zu verwenden.

    Ehm std::flush bewirkt nur das der Inhalt des Ausgabe-Buffers auf das Ausgabemedium übertragen wird und der Buffer danach leer zurückbleibt.
    In diesem Fall ist es noch nicht einmal nötig, das std::cin schon dafür sorgt, das std::cout geflusht wird. Gibt spezielle Fälle, wo man sowas braucht.
    Aja und ein std::endl ist nichts anderes als ein "\n" an den Ausgabe-Buffer anhängen und dann std::flush aufrufen!

    #include <iostream>
    #include <limits>
    
    int main()
    {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    

    sollte egentlich keine Eingabe erwarten ... ist zumindest keine der Funktionen für vorgesehen 😉



  • Aber warum wird bei mir dann eine Eingabeaufforderung in der Konsole aufgerufen? mh? Also ich mein jetzt halt so nen blickenden strich "_" schon klar^^?
    http://www.bilder-speicher.de/07090801649295.gratis-foto-hosting-page.html

    MfG
    Stromberg



  • oO normal sollte sich die Eingabeaufforderung sofort wieder schließen, da dein Programm eigentlich sofort am Ende sein müsste -.- Was fürn Compiler?



  • Compiler ist MinGW. IDE ist Code::blocks, wie man auf dem Bild unschwer erkennen kann 😃 (aber was für eine IDE es ist, is glaub unwichtig?)

    MfG
    Stromberg



  • Stromberg schrieb:

    Compiler ist MinGW. IDE ist Code::blocks, wie man auf dem Bild unschwer erkennen kann 😃 (aber was für eine IDE es ist, is glaub unwichtig?)

    MfG
    Stromberg





  • Hä? Nich so lustig!


Anmelden zum Antworten