Header - Fehler



  • Irgendwas funzt hier mitm linke nicht? Ich wollte ein externes Objekt erstellen (zur besseren Übersicht), das man dann in der main aufrufen kann.

    main.cpp

    #include "game.hpp"
    #include "operators.hpp"
    #include "story.hpp"
    using namespace std;
    
    int main()
    {
    
        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
    
    #include <iostream>
    #include "game.hpp"
    
    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;
    }
    

    story.hpp [meint ihr das es besser ist wenn ich das in ein story.cpp schreibe? Oder ist das egal ob story.hpp oder story.cpp?]

    #ifndef STORY_HPP_INCLUDED
    #define STORY_HPP_INCLUDED
    
    #include "game.hpp"
    
    extern 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"));
    
    #endif // STORY_HPP_INCLUDED
    

    ERRORS:

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

    MfG
    Stromberg



  • Hi,

    2 kleine Tipps:
    a) Globale Variablen sind "böööööööse" (und nur sehr, sehr selten wirklich notwendig bzw. das geringere Übel).
    b) mit "extern" erzeugt man noch kein Objekt, sondern weisst nur darauf hin, dass es irgendwo ein (globales) Objekt dieses Names gibt.

    Gruß,

    Simon2.



  • 3. Ausserhalb von Funktionen kannst du nicht einfach so Funktionen aufrufen (wus.new_story(...)).



  • Und was kann ich jetzt machen, wenn ich nicht alle wus.new_story(..) in main.cpp aufrufen möchte? Das wird so nä art text adventure, das ist doch schlechter stil, wenn in der main erst mal 1000 Zeilen Text stehen^^?
    Ich will das irgendwo eigens hinschreiben, das es schön sauber aufgeräumt ist....

    MfG
    Stromberg



  • du könntest deiner klasse game noch eine methode run hinzufügen. Dort kannst du deinen ganzen text reinschreiben. dann sieht deine deine main anweisung in etwa so aus

    int main()
    {
    game.init();
    game.run();
    game.deinit();
    
    return 0;
    }
    


  • Stromberg schrieb:

    Und was kann ich jetzt machen, wenn ich nicht alle wus.new_story(..) in main.cpp aufrufen möchte? Das wird so nä art text adventure, das ist doch schlechter stil, wenn in der main erst mal 1000 Zeilen Text stehen^^?
    Ich will das irgendwo eigens hinschreiben, das es schön sauber aufgeräumt ist....

    MfG
    Stromberg

    Hi,

    also wenn Du "1000 Zeilen Text" hast, würde ich den sowieso von File einlesen. Im Source macht Dir das eine "Riesen-Exe" (OK, bei 1000 Zeilen vielleicht noch nicht, kommt aber irgendwann), die jedesmal beim Start in den Speicher geladen werden muss - und von der Du nur 5% aktuell brauchst...
    Außerdem macht er den Code unübersichtlich.

    (Wenn man die "Einlese-Routine" sparen möchte und sich an der "Riesesexe" nicht stört, kann man den evtl. auch als Stringliteral in einer ".impl"-Datei includen)

    Für de "Güte der Programmstruktur" ist es nahezu unerheblich, ob Du 1000 identische Zeilen in main() oder in einer anderen Funktion unterbringst...

    Gruß,

    Simon2.



  • Okay, dann mach ich das mit einer "run" Methode, weil mit .txt Datein und sowas blick ich noch nicht durch.

    void game::run()
    {
        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"));
    
    }
    

    MfG
    Stromberg


Anmelden zum Antworten