While schleife



  • @Dpascalm sagte in While schleife:

    Ich habe auch

     fragen.~Fragen();
     antworten.~Antworten();
    

    enfernt. Aber wieso sollte ich das entfernen?

    Nein, die Frage ist: warum hast du das überhaupt geschrieben? Wer hat dir das beigebraucht?

    Die Funktion ~irgendwas wird automatisch da aufgerufen, wo das Objekt aus dem Scope verschwindet. Also dort, wo die geschwungene Klammer zu } steht.

    Bei

    void irgendeineFunktion() {
       Fragen f;
       if (bedingung) {
          Antwort a;
       }  // <-- hier wird a.~Antwort() aufgerufen
    } // <-- hier wird f.~Fragen() aufgerufen
    

    Die Destruktoren rufst du im Regelfall niemals* selbst auf.

    (* es sei denn, du weißt, was du tust, z.B. bei Unions)

    Als allgemeiner Tipp: deine while-Bedingung while (Eingabe == "ja" || Eingabe == "Ja" || Wiederholung == "Ja" || Wiederholung == "ja") sieht sehr kompliziert aus. Das "Eingabe" hat da auch nur was mit der Frage darüber zu tun, das "Wiederholung" nicht.

    Also wäre wohl etwas wie

    if (Eingabe == "ja" || Eingabe == "Ja") {
       quiz();
    }
    

    geeigneter als die while-Schleife.



  • @wob sagte in While schleife:

    Also wäre wohl etwas wie
    if (Eingabe == "ja" || Eingabe == "Ja") {
    quiz();
    }

    Und du darfst die Variable Eingabe auch bei der Frage zur Wiederholung benutzen.



  • Ich benutze nicht so gerne eine Variable für verschiedene Dinge.

    Allerdings könnte man es noch anders machen:

    bool istJa(const std::string &s) {
      return s == "Ja" || s == "ja" || s == "j" || s == "J";  // J und j für die faulen Leute
    }
    
    std::string liesString() {
      std::string eingabe;
      std::cin >> eingabe;
      // wir ignorieren hier, ob cin in failstate ist
      return eingabe;
    }
    
    (...)
    
    cout << "Beginnen?\n";
    if (istJa(liesString())) {
      do {
        quiz();
        cout << "Nochmal?\n";
      while (istJa(liesString()));
    }
    


  • @wob: Du hast gerade unnötigerweise den Code verkompliziert 😉 ->

    cout << "Beginnen?\n";
    while (istJa(liesString()))
    {
        quiz();
        cout << "Nochmal?\n";
    }
    


  • @wob sagte in While schleife:

    Die Funktion ~irgendwas wird automatisch da aufgerufen, wo das Objekt aus dem Scope verschwindet. Also dort, wo die geschwungene Klammer zu } steht.

    Genau.
    Frage: Wie ruft man in C++ einen Destruktor auf?
    Antwort: }
    🙂



  • @hustbaer sagte in While schleife:

    @wob sagte in While schleife:

    Die Funktion ~irgendwas wird automatisch da aufgerufen, wo das Objekt aus dem Scope verschwindet. Also dort, wo die geschwungene Klammer zu } steht.

    Genau.
    Frage: Wie ruft man in C++ einen Destruktor auf?
    Antwort: }
    🙂

    Sauber 🙂



  • @Th69 sagte in While schleife:

    @wob: Du hast gerade unnötigerweise den Code verkompliziert 😉 ->

    cout << "Beginnen?\n";
    while (istJa(liesString()))
    {
        quiz();
        cout << "Nochmal?\n";
    }
    

    Naja, das geht aber nur, solange du keine else-Fälle hast. Insbesondere nach dem initialen "Beginnen?" kann ich mir sowas vorstellen wie ein cout von "Schade, dann wurde ich armes Programm ja ganz umsonst gestartet" 🙂 Da wäre dann auch ein eary return möglich, wenn man das if vor-not-et.



  • Ok ich hab jetzt die erste while Schleife ersetzt gegen einer if Funktion.
    Eine do while Schleife nimmt das Programm nicht an. Ich denke weil die fragen.fragenanzahl auf 3 fragen laufen. Und eine do while Schleife würde doch noch ein viertes mal laufen oder nicht?
    Wahrscheinlich ist die Lösung zu dem Problem einfach aber ich komme nicht drauf. Ich probiere es ja jetzt schon länger aber ich komme nicht darauf zurück . Ich vermute das es das return 0 ist was das Programm ja beendet.
    Aber wenn ich es entferne meckert das Programm weil ich es in #include FragenAntworten.h als rückgabe (return Antwort [wert] ) benutze.

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Fragen
    {
    public:
        Fragen() {};
       
    
        const static int fragenAnzahl = 3;
    
        string getFrage(int wert)
        {
            string Frage[fragenAnzahl];
    
            Frage[0] = "frage1";
            Frage[1] = "frage2";
            Frage[2] = "frage3";
    
            return Frage[wert];
    
        }
    private:
    };
    class Antworten
    {
    public:
    
        Antworten() {};
        
    
        const static int antwortenAnzahl = 3;
    
        string getAntworten(int wert)
        {
            string Antwort[antwortenAnzahl];
    
            Antwort[0] = "antwort1";
            Antwort[1] = "antwort2";
            Antwort[2] = "antwort3";
    
            return Antwort[wert];
    
        }
    
    private:
    
    };
    


  • @Dpascalm du weißt schon, dass du da ungültigen speicher zurück gibst?



  • @Wade1234 sagte in While schleife:

    @Dpascalm du weißt schon, dass du da ungültigen speicher zurück gibst?

    Wo tut @Dpascalm das?



  • @wob man kann unter c++ teile aus lokal in funktionen angelegten arrays zurück geben?



  • Solange das nicht als Referenz oder Pointer erfolgt: warum sollte das nicht gehen?



  • @wob es sieht halt irgendwie komisch aus.



  • @Wade1234 Finde ich nicht. Sieht ganz normal aus.

    Man fragt sich hier aber natürlich, warum immer erst ein Array von 3 Strings erzeugt wird, das dann wieder verworfen wird, wenn man eigentlich nur einen String haben will.



  • @wob achso dann hab ich mich wohl geirrt.🙄



  • @Wade1234 An der Stelle wird ja kein Teil eines lokalen Arrays zurück gegeben, sondern ein String. D.h. ein Wert des Arrays wird in ein String kopiert und der wird zurück gegeben. Das sollte in C mit den entsprechenden Datentypen auch gehen, oder?


Anmelden zum Antworten