Wertebereich für Variable festlegen



  • Nein so etwas gibt es nicht, aber der übliche Weg so etwas zu bewerkstelligen ist es sich diesen Typen selbst zu bauen.

    Z.b

    #include <cassert>
    
    class Monat
    {
    public:
    
      // Precondition: m >= 1 && m <= 12
      void set_monat(int m)
      { 
        assert(m >= 1 && m <= 12);
        monat_ = m;
      }
    
      void get_monat() const {return monat_;}
    private:
     int monat_;
    };
    

    Hier wird der interne Wert von der Klasse geschützt und du kannst somit komplett kontrollieren was monat_ für Werte annehmen kann (Setter).
    Die Precondition formuliert die Aufgabe (und das assert checkt diese) des Aufrufers, da er sich daran halten muss und sonst einen Fehler zur Laufzeit bekommt.
    Du könntest natürlich auch ein Standardverhalten definieren, dass z.B bei keinem gültigen Wert einfach Januar genommen wird oder so. Häng ein wenig von der Anwendung ab.



  • Zuerst Danke für die Antworten!

    Wenn jemand noch andere Möglichkeiten kennt, bitte nennen 😉
    Geht das vielleicht noch was mit na true / false Abfrage?

    Gruß
    Miliano



  • Meinst du sowas?

    class Monat
    {
    public:
    
      typedef enum
      {
        Januar,
        Februar,
        ...,
        Dezember
      } Name;
    
      // Precondition: m >= 1 && m <= 12
      bool set_monat(Name m)
      {
        if (m >= Januar && m <= Dezember)
        {
           monat_ = m;
           return true;
        }
        return false;
      }
    
      Name get_monat() const {return monat_;}
    private:
      Name monat_;
    };
    

    Das ist das Beispiel von drakon, um ein von dir bevorzugtes enum erweitert.
    Auf die Monatsnamen kannst du dann so zugreifen:

    Monat::Name meinmonat = Monat::April;
    


  • typedef enum {
        ...
    } Name;
    

    Diese typedef -Geschichte ist unnötiger und hässlicher C-Style und hat mit C++ nichts am Hut. In C++ kann man das ganz logisch deklarieren wie eine Klasse:

    enum Name {
        ...
    };
    
    bool set_monat(Name m)
    

    Ebenfalls veraltetes Möchtegern-Errorhandling aus C Zeiten.
    In C++ nimmt man exceptions.

    void set_monat(Name m) throw(std::out_of_range)
    {
        if (m < Januar || m > Dezember)
            throw std::out_of_range("Monat::set_monat");
    
        monat_ = m;
    }
    


  • Berichtigung schrieb:

    Diese typedef -Geschichte ist unnötiger und hässlicher C-Style und hat mit C++ nichts am Hut. In C++ kann man das ganz logisch deklarieren wie eine Klasse:

    Kann man so machen und da stolpre ich immer wider drüber. Weil ich nicht nur C oder C++ programmiere. Deswegen habe ich damit auch ein gespaltenes Verhältnis. Auf der einen Seite finde ich es gut, dass es in C++ auch kurz geht. Aber anderseits kommt es damit besser zur Geltung, dass hier ein neuer Typ kommt. Aber C ist natürlich kein C++.

    Berichtigung schrieb:

    bool set_monat(Name m)
    

    Ebenfalls veraltetes Möchtegern-Errorhandling aus C Zeiten.
    In C++ nimmt man exceptions.

    Hab ich mit Absicht nicht gemacht. Eine Exception macht in meinen Augen nur Sinn, wenn man sie auch behandelt. Sprich du musst einen Platz für deinen try-catch-Block finden. Oder anders ausgedrückt, eine Exception ist ein besseres goto .



  • eine Exception ist ein besseres goto .

    ...



  • Ich würde es mit operatorüberladungen machen,....

    Zuweisungsoperator und cast operator...

    ist bei der späteren verwendung einacher...

    grüße



  • Miliano schrieb:

    Ich möchte zum Beispiel eine Variable "Monat" vom Typ Integer auf eine Zahl von 1-12 begrenzen.

    Was soll denn passieren, wenn im Programm einer solchen Variablen beispielsweise der Wert 13 zugewiesen wird?



  • Nochmal vielen Dank für die Hilfe! Finde es super, wenn man bei einem Problem, so tatkräfig unterstützt wird!
    Wenn z.B. 13 eingeben wird, soll ein Info Text kommen, das nur Werte zwischen 1 und 12 erlaubt sind und wieder zur Eingabe gesprungen werden.
    Finde es aber ganz schön heftig, das eine einfache Einschränkung der Varibalen so kompliziert ist. Hätte mir das leichter vorgestellt. Aber so lerne ich bei diesem Problem immerhin gleich wieder einiges dazu 😉

    Gruß
    Miliano



  • Moin,

    bin mir nicht sicher, ob dies - für deinen Fall - nicht schon etwas zu viel des Guten ist aber diese Library wird gerade der Boost-Review-Prozedur unterzogen:

    http://student.agh.edu.pl/~kawulak/constrained_value/

    Eventuell hilft sie dir ja weiter.



  • Hallo nochmal 😉

    Hab das ganze jetzt etwas einfacher gelöst:

    cout <<"Monat der Geburt: ";
    cin >>Monat;
    while (Monat<1 || Monat>12)
    {
    cout << "Geben Sie eine Zahl zwischen 1 und 12 ein!" "\n";
    cout << "Neuer Versuch: ";
    cin >> Monat;
    }

    Was haltet ihr davon?
    Gruß
    Miliano


  • Administrator

    Miliano schrieb:

    Was haltet ihr davon?

    http://www.c-plusplus.net/forum/200753
    Vorletzter Punkt. Wenn du gleich gesagt hättest, dass es darum geht, bei einer Eingabe den Wertebereich zu prüfen, hättest du ohne Umwege dieses Resultat erhalten.

    Grüssli



  • Miliano schrieb:

    Wenn jemand noch andere Möglichkeiten kennt, bitte nennen 😉

    Ada nutzen!


Anmelden zum Antworten