[ANFÄNGER] Enumeratoren in Strukturen



  • Hallo Leute.

    Folgendes Beispiel:

    enum land { Deutschland, Oesterreich, Schweiz };
    
    struct anschrift
    {
        land Land;
        std::string Adresse;
        int HausNummer;
    };
    
    int main()
    {
        anschrift MeineAnschrift;
        std::cout << "Bitte geben Sie zuerst ihr Land ein:\n";
        std::cin >> MeineAnschrift.Land;
    }
    

    Mein Problem ist, dass der Compiler eine Fehlermeldung ausspuckt.

    Bitte beachten, dass ich noch C++ Anfänger bin und mich im Moment durch ein C++ Buch arbeite.

    Liebe Grüße,
    Alex



  • Ein Struct wird mit "};" geschlossen. Auf solche Fehler weißt der Compiler aber meist hin, wenn ich deinen Code kompilieren will bekomme ich unter anderem diesen Hinweis:

    prog.cpp:12: note: (perhaps a semicolon is missing after the definition of ‘anschrift’)

    Also einfach mal lesen, was der Compiler ausspuckt 😉



  • War nur ein Leichtsinnsfehler, aber der eigentliche Fehler wird ja bei der Zeile angezeigt, wo die Eingabe in "MeineAnschrift.Land" gespeichert wird.

    Lg,
    Alex



  • Awesome96 schrieb:

    Mein Problem ist, dass der Compiler eine Fehlermeldung ausspuckt.

    Dann poste die doch. z.B:

    error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::istream' (or there is no acceptable conversion)
    

    Dein Problem ist also, dass es für operator >> keine Überladung gibt, sodass du von einem std::istream in ein "land" lesen kannst. Diese Funktion musst du selbst schreiben:

    enum land { Unbekannt, Deutschland, Oesterreich, Schweiz };
    
    std::istream &operator >> (std::istream &stream, land &Land)
    {
      std::string s; // Du könntest natürlich auch in einen Integer lesen, und 1 zu DE machen etc. 
      // Man könnte auch überlegen, das enum Zeugs hier weg zu lassen und gleich einen std::string zu nehmen.
      stream >> s;
      if (s == "Deutschland")
        Land = Deutschland;
      else if (s == "Oesterreich")
        Land = Oesterreich;
      else if (s == "Schweiz")
        Land = Schweiz;
      else
        Land = Unbekannt;
      return stream;
    }
    
    struct anschrift
    {
      land Land;
      std::string Adresse;
      int HausNummer;
    };
    
    int main()
    {
      anschrift MeineAnschrift;
      std::cout << "Bitte geben Sie zuerst ihr Land ein:\n";
      std::cin >> MeineAnschrift.Land;
    }
    


  • Okay Danke, das hilft mir schonmal.
    Das Problem ist halt, ich muss eine Aufgabe erledigen, die in einem C++ Buch erteilt wird.

    Zitat:

    Entwickeln Sie eine C++-Anwendung, die den Anwender zur Eingabe einer
     Bestellung auffordert. Der Anwender muss hierbei der Reihe nach die bestellte
     Ware, die Lieferanschrift, die Kreditkartennummer und das Gültigkeitsdatum der
     Kreditkarte eingeben. Die Daten sollen hierbei in geeigneten Variablen unter 
    Zuhilfenahme benutzerdefinierter Strukturen und Enumerationen gespeichert werden.
     Lieferanschrift und Kreditkartendaten sollen jeweils in einer eigenen Struktur
     gespeichert werden. Die Bestellung wird ebenfalls in einer eigenen Struktur 
    gespeichert, die sich der anderen beiden Strukturen bedient. Außerdem soll das 
    [u]Land, das in der Lieferanschrift gespeichert wird, vom Typ einer Enumeration 
    sein.[/u]
    

    Wie soll ich die Anweisung in der letzten Zeile in Code umsetzen?



  • Awesome96 schrieb:

    Wie soll ich die Anweisung in der letzten Zeile in Code umsetzen?

    Siehe oben. 😉



  • Ich glaub nicht das das die geforderte Problemlösung ist, denn das was du da oben gepostet hast verstehe ich zwar ungefähr aber ich hab es bis jetzt weder gelernt noch könnte ich es selbst umsetzen, ohne deine Vorlage.
    Es muss schon für einen Anfänger sein.

    Trotzdem Danke für deine Bemühungen. 🙂

    Edit: Damit meine ich übrigends nicht, du sollst es mir erklären, sondern das ich einfach eine Problemlösung brauche die ich mit meinen jetzigen (mageren) Kenntnissen als Anfänger verstehe, denn eine solche ist ja auch im Buch gefordert.



  • Es gibt im Großen und Ganzen keine andere sinnvolle Lösung. Du kannst natürlich statt operator >> () einfach eine Funktion readLand() oder so machen, aber letztlich bleibt es immer das Gleiche. Ein stumpfer Cast nach int würde auch funktionieren, aber das ist natürlich wirklich unschön. Nur mal so aus Interesse: Aus welchem Buch ist die Aufgabe?


  • Mod

    Awesome96 schrieb:

    Edit: Damit meine ich übrigends nicht, du sollst es mir erklären, sondern das ich einfach eine Problemlösung brauche die ich mit meinen jetzigen (mageren) Kenntnissen als Anfänger verstehe, denn eine solche ist ja auch im Buch gefordert.

    Dann schreib es eben weniger elegant. Operator>> ist auch nur ein Funktionsname, den kannst du auch ändern:

    void lies_land_von_cin (land &Land)
    {
      std::string s; 
      std::cin >> s;
      if (s == "Deutschland")
        Land = Deutschland;
      else if (s == "Oesterreich")
        Land = Oesterreich;
      else if (s == "Schweiz")
        Land = Schweiz;
      else
        Land = Unbekannt;
    }
    
    int main()
    {
      anschrift MeineAnschrift;
      std::cout << "Bitte geben Sie zuerst ihr Land ein:\n";
      lies_land_von_cin(MeineAnschrift.Land);
    }
    

    Oder falls du keine Funktionen kennst, dann eben so:

    int main()
    {
      anschrift MeineAnschrift;
      std::cout << "Bitte geben Sie zuerst ihr Land ein:\n";
      std::string s; 
      std::cin >> s;
      if (s == "Deutschland")
        MeineAnschrift.Land = Deutschland;
      else if (s == "Oesterreich")
        MeineAnschrift.Land = Oesterreich;
      else if (s == "Schweiz")
        MeineAnschrift.Land = Schweiz;
      else
        MeineAnschrift.Land = Unbekannt;
    }
    


  • Okay, Danke. Verstehe das ganze jetzt!

    @Oben: Ja, Funktionen kenn ich schon. Aber Danke.


Anmelden zum Antworten