Problem bei meinem HTML Programm (Komische Fehler)



  • Hey Leute.
    Ich schreibe momentan ein Programm das ausführbare HTML Daten erstellt.
    Bloß tauchen folegnde seltsame Fehler auf:

    In file included from Main.cpp

    field `HTML' has incomplete type

    In function `int main()':

    `setZustand' has not been declared

    request for member of non-aggregate type before '(' token

    `Schreibe' has not been declared

    jump to case label

    crosses initialization of `std::string MyZustand'

    usw. -.-

    Was habe ich da falsch gemacht?
    Naja ich geb mal den Code durch, da man beim sehen besser sieht wo der fehler ist^^

    // Main.cpp
    #include <string>
    #include <iostream>
    #include "Builder.hpp"
    using namespace std;
    
    int main()
    {
        int Aktion;
        string Pfad;
        bool Ende;
    
        cout << "|>----------------------------------------------------------------------------<|" << endl;
        cout << "|>-----------------------------HyperTextMaker---------------------------------<|" << endl;
        cout << "|>----------------------------------------------------------------------------<|" << endl;
        cout << "|>> Zuöffnene Datei eingeben (Muss im selben Verzeichnis sein): ";
    
        cin >> Pfad;
        cout << endl;
    
        Builder* Datei = new Builder(Pfad);
    
        cout << "|>----------------------------------------------------------------------------<|" << endl;
        cout << "|> 1.) Text einfügen." << endl;
        cout << "|> 2.) Bild einfügen." << endl;
        cout << "|> 3.) Hintergrundfarbe setzen." << endl;
        cout << "|> 4.) Beenden!" << endl;
        cout << "|>----------------------------------------------------------------------------<|" << endl;
    
        do
        {
              cout << "|>> Menüpunkt auswählen: ";
              cin >> Aktion;
    
              switch (Aktion)
              {
                     case 1:
                          string MyText;
                          string MyZustand;
    
                          cout << "|>> Welcher Zustand? (Fett, Kursiv o. Unterstrichen): ";
                          cin >> MyZustand;
                          Datei.setZustand(MyZustand);
                          cout << "|>> Bitte Text eingeben: " << endl;
                          cin >> MyText;
                          Datei.Schreibe(MyText);
                          Datei.setZustand_FALSE();
                          break;
                     case 2:
                          cout << "Nicht da." << endl;
                          break;
                     case 3:
                          string HintergrundFarbe;
    
                          cout << "|>> Bitte Hintergrundfarbe eingeben: ";
                          cin >> HintergrundFarbe;
    
                          Datei.setHintergrund(HintergrundFarbe);
                          break;
                     case 4:
                          Ende = true;
                          delete Datei;
                          break;
                     default:
                             cout << "Ungültige Eingabe!" << endl;
                             break;
              }
        } while (Ende != true);
        system("PAUSE");
    }
    
    // Builder.hpp
    
    /*-----> Informationen <-----*\
    | Autor       : Michael P     |
    | Projektname : Builder (HTML)|
    |>---------------------------<|
    |>Versionsstatus: v0.5        |
    \*****************************/
    
    #ifndef BUILDER_HPP_
    #define BUILDER_HPP_
    
    class Builder
    {
    private:
       // true(AN), false(AUS).
       bool Fett;
       bool Kursiv;
       bool Unterstrichen;
    
       std::fstream HTML; // HTML Datei.
    public:
       //-----> Konstruktoren <-----//
       Builder(std::string Datei);
       //-----> Destruktoren <-----//
       ~Builder();
       //-----> Getter <-----//
       void getHtmlCode() const;
       //-----> Prüfer <-----//
       bool isLeer();
       //-----> Setter <-----//
       void setZustand(std::string Zustand);
       void setZustand_FALSE();
       void setSchriftart();
       void setSchriftgrad();
       void setHintergrund(std::string Farbe);
       //-----> Andere <-----//
       void Schreibe(std::string Text);
    };
    
    #endif
    
    // Builder.cpp
    #include <string>
    #include <fstream>
    
    #include <iostream>
    
    #include "Builder.hpp"
    
    using namespace std;
    
    //----------> Konstruktoren! <----------//
    Builder::Builder(string Datei)
    {
             HTML.open(Datei);
    
             HTML << "<html>" << endl;
             HTML << "<body>" << endl;
    }
    
    //----------> Destruktoren! <----------//
    Builder::~Builder()
    {
             HTML << "</body>" << endl;
             HTML << "</html>" << endl;
    
             HTML.close();
    }
    
    //----------> Getter! <----------//
    //----------> Prüfer! <----------//
    bool Builder::isLeer()
    {
    }
    
    //----------> Setter! <----------//
    void Builder::setZustand(string Zustand)
    {
         if      (Zustand=="Fett")          {Fett = true;}
         else if (Zustand=="Kursiv")        {Kursiv = true;}
         else if (Zustand=="Unterstrichen") {Unterstrichen = true;}
    }
    
    void Builder::setZustand_FALSE()
    {
         Fett = false;
         Kursiv = false;
         Unterstrichen = false;
    }
    
    void Builder::setSchriftart()
    {
    }
    
    void Builder::setSchriftgrad()
    {
    }
    
    void Builder::setHintergrund(string Farbe)
    {
         if      (Farbe == "Schwarz")      {HTML << "<body style=\"background-color: #000000;\">" << endl;}
         else if (Farbe == "Dunkel Grün")  {HTML << "<body style=\"background-color: #008000;\">" << endl;}
         else if (Farbe == "Oliev")        {HTML << "<body style=\"background-color: #808000;\">" << endl;}
         else if (Farbe == "Dunkel Blau")  {HTML << "<body style=\"background-color: #000080;\">" << endl;}
         else if (Farbe == "Lila")         {HTML << "<body style=\"background-color: #800080;\">" << endl;}
         else if (Farbe == "Hellgrün")     {HTML << "<body style=\"background-color: #008080;\">" << endl;}
         else if (Farbe == "Grau")         {HTML << "<body style=\"background-color: #808080;\">" << endl;}
         else if (Farbe == "Silber")       {HTML << "<body style=\"background-color: #c0c0c0;\">" << endl;}
         else if (Farbe == "Rot")          {HTML << "<body style=\"background-color: #FF0000;\">" << endl;}
         else if (Farbe == "Grün")         {HTML << "<body style=\"background-color: #00FF00;\">" << endl;}
         else if (Farbe == "Gelb")         {HTML << "<body style=\"background-color: #FFFF00;\">" << endl;}
         else if (Farbe == "Blau")         {HTML << "<body style=\"background-color: #0000FF;\">" << endl;}
         else if (Farbe == "Pink")         {HTML << "<body style=\"background-color: #FF00FF;\">" << endl;}
         else if (Farbe == "Hellblau")     {HTML << "<body style=\"background-color: #00FFFF;\">" << endl;}
         else if (Farbe == "Weiß")         {HTML << "<body style=\"background-color: #FFFFFF;\">" << endl;}
         else                              {cout << "Ungültige Eingabe!" << endl;}
    }
    
    //----------> Andere! <----------//
    void Builder::Schreibe(string Text)
    {
         if (Fett == true)                {HTML << "<b>" << Text << "</b>" << endl;}
         else if (Kursiv == true)         {HTML << "<i>" << Text << "</i>" << endl;}
         else if (Unterstrichen == true)  {HTML << "<u>" << Text << "</u>" << endl;}
         else                             {HTML << Text << endl;}
    }
    
    //---------->> ENDE! <<----------//
    

    Ich finde die Fehler nicht, er meint ja als die funktion der klasse wären nicht decladiert und in dem case will er das string auch irgentwie nicht...

    Mfg Wikinger75!



  • Hallo, habs mal gerade versucht zu kompilieren und eigentlich sind die Fehler relativ leicht mit der Fehlerangabe des Compilers zu finden:

    in "Builder.hpp" fehlt

    #include <fstream>
    

    dann: open nimmt keinen string, sonder const char*

    Builder::Builder(string Datei)
    {
             HTML.open(Datei.c_str());
    
             HTML << "<html>" << endl;
             HTML << "<body>" << endl;
    }
    
    bool Builder::isLeer()
    {
    // hier muss ein bool zurückgegeben werden!
    }
    

    Und so geht man dann Fehler für Fehler durch bis keiner mehr übrig bleibt.
    Ich denke mal dein Compiler spuckt sogar noch Zeilennummern der Fehler aus, was es dir dann noch einfacher macht.
    Den Rest schaffst Du bestimmt selbst :p



  • Ich denke mal dein Compiler spuckt sogar noch Zeilennummern der Fehler aus, was es dir dann noch einfacher macht.

    I.d.R springt er sogar in die Zeile, wenn man einen Doppelklick auf die Fehlermeldung macht.

    @Wikinger75:
    Kleiner Tipp:
    Solche if/elseif Kaskaden kannst du dir sparen und z.B mit einer map lösen, wo du einfach die Farben einträgst und dann in einer Schleife ausgeben kannst. Dann speicherst du da einfach 2 strings drin und kannst dir die Redundanz der Ausgabe sparen.



  • gut
    1.) Warum muss das ein Char sein?

    Hab festegstellt, dass (xD)
    1.) Kein wunder das er meinte das es die funktion nicht gibt, da der zeiger nur Zeigerfunktionen und keine normalen funktion etgegen nimmt.

    void func(); // Normal
    void* func(); // Zeigerfunc...
    

    Daher hab ich aus

    Builder* Datei = new Builder(Pfad);
    
    Builder Datei(Pfad);
    

    gemacht.

    Und im case kann ich keine variablen definieren, warum?



  • Wikinger75 schrieb:

    Warum muss das ein Char sein?

    Die Schnittstelle ist nunmal so definiert, dass sie einen char* (keinen char ) nimmt. Im neuen Standard soll sich das ändern.

    Wikinger75 schrieb:

    Und im case kann ich keine variablen definieren, warum?

    switch-case ist diesbezüglich etwas merkwürdig. Skalare Typen können beispielsweise definiert werden. Du kannst das umgehen, indem du einfach einen lokalen Block anlegst (durch die geschweiften Klammern).



  • Ah gut Dann müsste das in etwas so ausehen?

    switch (VAR)
    {   
    case 1:
    {
    string 1;
    string2;
    }
    // funktionen...
    break;
    default:
    break;
    }
    

    Wan kommt der neue standart? Gibs irgentso ne news seite?



  • Wikinger75 schrieb:

    Wan kommt der neue stan****?

    Meinst du eine neue Standarte? Da ist mir nix bekannt... 😉



  • Ja genau den mein ich den neuen Standarte. 🙄



  • Nein, ich meinte, die Schnittstelle von std::fstream würde erweitert, sodass sie auch mit std::string kompatibel ist. Am switch ändert sich soweit ich weiss nichts.

    Der neue C++-Standard sollte eigentlich 2009 erscheinen, aber ganz genau weiss das niemand... 😉



  • Ahso ja denn ^^
    Ma abwarten.

    THX Leuts 😃 .



  • Ein weiterer für mich unbegründeter Fehler ist, wenn man eine ungültige eingabe macht, dieser zum default operator springt und sich in einer endlos schleife verhädert, wie ist dies möglich?
    Wie kann ich dieses Problm beseitigen?



  • Wie sieht denn der dazugehörige Code aus (nur der relevante Teil)?

    default ist im Übrigen kein Operator, sondern eine Sprungmarke.



  • Das ist es ja der fehler pasier werähnd des programmlaufs, nicht zur compilerzeit.
    Wenn ein ungültiger wert eingegeben wird, dann geht es in eine endlose-schleife.



  • Ja, ich hatte aber nach dem Code gefragt.



  • Der hat sich nicht verändert...

    jedoch wenn ich richtige liege müsste der fehler hier sein, da er ja dort in die endlos schleife springt oder?

    default:
                             cout << "Ungültige Eingabe!" << endl;
                             break;
    


  • Leer mal den Eingabepuffer. Bevor du auf die Eingabe wartest..



  • drakon schrieb:

    Leer mal den Eingabepuffer.

    Leichter gesagt als getan... 😉

    Hier, hier, hier und hier wurde neben den 314 anderen Threads das Thema besprochen. Aber vorweg: Eine wirklich saubere Möglichkeit gibt es dafür nicht.



  • Nexus schrieb:

    drakon schrieb:

    Leer mal den Eingabepuffer.

    Leichter gesagt als getan... 😉

    Ich weiss, aber ich war zu faul alles herauszusuchen.. 😉



  • ehm würde ich mit clear nicht den inhalt der datei löschen?^^



  • Wikinger75 schrieb:

    ehm würde ich mit clear nicht den inhalt der datei löschen?^^

    Nein.


Anmelden zum Antworten