Mengen Klasse





  • Mario.. schrieb:

    Wie könnte ich das denn gestalten, mit min und max bei leerer Menge?

    assert



  • statt assert würde ich eher eine exception werfen.
    Assert beendet doch das programm, oder? Während eine Exception dann vom Aufrufer behandelt werden könnte.



  • blub² schrieb:

    #edit: Achso, prinzipiell lieber kein using namespace verwenden sondern namespaces ausschreiben, kannst es hier aber auch so lassen.

    Das ist übertrieben. using in Headern ist (in 99% der Fälle) böse, aber in Source-Dateien macht das überhaupt nichts, weil die Auswirkungen in einem kontrollierbaren Bereich bleiben.



  • Carstig schrieb:

    statt assert würde ich eher eine exception werfen.
    Assert beendet doch das programm, oder? Während eine Exception dann vom Aufrufer behandelt werden könnte.

    Wie willst Du einen Programmierfehler behandeln?
    Nee, assert ist hier das Mittel der Wahl. Wir betreiben ja kein Java.



  • volkard schrieb:

    Nee, assert ist hier das Mittel der Wahl. Wir betreiben ja kein Java.

    Sehe ich aber auch anders.
    Es ist doch völlig okay in einer (vorhandenen) leeren Menge nach dem Maximum zu fragen.
    Ich krieg ja auch kein assert, wenn ich in einem leeren String suche.
    Ich dachte eher daran die Funktion in z.B.

    bool findMax(int& result) const {...}
    

    umzuändern.



  • Gut das const hatte ich ganz vergessen:

    class IntMenge {
    
    private:
    	std::vector<int> Menge;
    public:
    	void hinzufuegen(const int el);
    	void entfernen(const int el);
    	bool istMitglied(const int el) const;
    	size_t size() const;
    	void anzeigen() const;
    	void loeschen();
    	int getMax() const;
    	int getMin() const;
    	void sortieren();
    };
    

    Noch eine Frage. Was hat es denn für einen Vorteil meine eigene Methode size() anstatt Menge.size() zu nutzen?



  • ich sehe gerade...sollte vor den Rückgabetyp auch ein const?



  • volkard schrieb:

    Carstig schrieb:

    statt assert würde ich eher eine exception werfen.
    Assert beendet doch das programm, oder? Während eine Exception dann vom Aufrufer behandelt werden könnte.

    Wie willst Du einen Programmierfehler behandeln?
    Nee, assert ist hier das Mittel der Wahl. Wir betreiben ja kein Java.

    Ich dachte eher an den Anwendungs-Fall, wenn getMin/Max auf eine leere Menge aufgerufen wird. Dann würde ich statt 0 zurückzugeben eher eine Exception werfen.
    Denn 0 könnte ja, bei einer Menge mit nur einem Element mit dem Wert 0, durchaus ein korrekter Min/Max-Wert sein.
    ... bei einer leeren Menge entspricht 0 nicht wirklich dem Min/Max-Wert.



  • Mario.. schrieb:

    Noch eine Frage. Was hat es denn für einen Vorteil meine eigene Methode size() anstatt Menge.size() zu nutzen?

    Da 'Menge' richtigerweise private ist, kannst du Menge.size() ja ausserhalb der Klasse gar nicht nutzen.

    ch sehe gerade...sollte vor den Rückgabetyp auch ein const?

    Nein.



  • Das sind ja aber alles Klassenmethoden und da kann ich ja auf die Private Eigenschaften zugreifen. Und wieso sollte vor den Rückgabetyp kein const?



  • ... bei einer leeren Menge entspricht 0 nicht wirklich dem Min/Max-Wert.

    Sicher nicht, aber ein Mathematiker haut dir auch keine runter, wenn du nach dem
    Maximum einer Menge fragst, die kein Maximum hat.
    Das ist keine Ausnahme sondern was normales und legitimes.

    @Mario..:
    Ach verlesen, sry. In deinen eigenen Funktionen ist das so'ne Sache.
    Ggf. tauscht du z.B. vector durch ein Array (was zwar doof wäre, aber möglich).
    Dann müsstest du nicht deinen kompletten Code ändern, sondern nur die Size-Funktion.
    Aber wenn ich mir sicher bin, dass sich da nix ändert, dann rufe ich auch direkt size vom vector auf.



  • Mario.. schrieb:

    ich sehe gerade...sollte vor den Rückgabetyp auch ein const?

    All Deine Funktionen, die einen Rückgabewert liefern, geben diesen als "Value" zurück.
    Würden sie Referenzen auf interne, private Member zurückliefern, würde ein const Sinn machen.

    zb:

    const std::vector<int> & getPrivateVector() { return Menge; }
    

    (über die Sinnhaftigkeit obiger Funktion würde ich jetzt aber nicht diskutieren wollen :D)



  • Jockelx schrieb:

    ... bei einer leeren Menge entspricht 0 nicht wirklich dem Min/Max-Wert.

    Sicher nicht, aber ein Mathematiker haut dir auch keine runter, wenn du nach dem
    Maximum einer Menge fragst, die kein Maximum hat.
    Das ist keine Ausnahme sondern was normales und legitimes.

    Mathematiker sind ja auch Weicheier <duck und renn>
    Nein im Ernst: Ich glaube ein Mathematiker (Los gebt Euch zu erkennen) würde widersprechen, wenn ich sage, der kleinste Wert aller Elemente (getMin) einer leeren Menge ist 0.

    Wie man dann diesen Ausnahme/Normalfall in das Methodendesigen einbringt ist Geschmacksache.



  • Carstig schrieb:

    (Los gebt Euch zu erkennen)

    Hier!

    Carstig schrieb:

    würde widersprechen, wenn ich sage, der kleinste Wert aller Elemente (getMin) einer leeren Menge ist 0.

    Natürlich würde er das. Das haben wir ja lange geklärt.
    Es gibt aber unendlich viele Mengen ohne Minimum und wenn diese Klasse Mengen darstellt,
    soll sie mir bitte diesen Normalfall nicht mit einem assert oder einer Exception quittieren,
    wenn ich danach frage.



  • Was hälst du von einer STL konformen Lösung, indem du einen Iterator für das Minimum/Maximum zurückgibst (oder zumindest einen Pointer darauf)? Damit hätten wir auch beide Diskussionspunkte zusammengeführt 😉

    class IntMenge
    {
       ...
    public:
       int const* getmaximum() const
       {
          if( true == empty() )
          {
             // kein Maximum
             return 0;
          }
          return (Adresse des Maximums);
       }
    };
    


  • Ist es nicht eher problematisch Pointer auf std::vector Elemente rauszugeben?
    Was wenn der std::vector intern seinen Buffer beim vergrößern verlagert? Dann stimmen doch die ganzen Pointer nicht mehr.



  • Ich jetzt? Nix 😉
    Wie gesagt, ich finde die ganze Funktion 'getMax' falsch, da Sie suggeriert, dass
    es immer ein Maximum geben müsste, was ja nicht der Fall ist.
    Ich würde wie oben das ganze find.. oder exists.. oder so nennen und bool zurückgeben und den Wert als Referenz.
    Jetzt hab ich mich aber auch ausreichend zu dem doch eher unwichtigen Punkt geäussert.



  • Wenn der Mathematiker das Minimum einer leeren Menge holt, ist der Beweis einfach kaputt. Er hätte sich aber mal fein einen Bleistift gewünscht, der ein geeignetes assert eingebaut hat, und zerbricht, wenn man so einen Unfug schreibt.
    Exceptions sind echt zu weich für echte Programmierfehler.



  • Der Mathematiker wird in Beweisen sehr oft nutzen, dass eine Menge kein Minimum hat.
    Insbesondere falls Mario sich überlegt seine Menge mal nicht mehr durch einen vector, sondern durch eine z.B. stetige Funktion zu representieren,
    ist die getMax-Funktion mit assert oder Exception schrott.


Anmelden zum Antworten