Operatoren () und = kombiniert überschreiben



  • Hallo,

    ich habe eine Klasse "Verwaltung", die Daten verwaltet. Sagen wir mit den Argumenten
    int a, int b
    können auf einzelne Daten dieser Klasse zugegriffen werden.

    Nun möchte ich folgende Zugriffe ermöglichen:

    c = Verwaltung(a,b); // liefert einen bestimmtent Datensatz
    Verwaltung(a,b) = c; // überschreibt einen vorhandenen Datensatz oder legt einen neuen an, wenn er noch nicht vorhanden war

    Den ersten Punkt habe ich hinbekommen, nur bei der Zuweisung komme ich nicht weiter. Kann mir da jemand helfen, bzw. ist das überhaupt möglich?

    Ich danke für eure Antworten!



  • Möglich ist es schon. Du kannst eine Referenz auf das Objekt zurückgeben und dann kannst du das so schreiben. Allerdings stellt sich die Frage, ob du nicht lieber einen Setter hast.

    SetVerwaltung (a,b,c)
    

    Ist gebräuchlicher, als die Variante mit der Referenz.



  • Ich überlade operator() eigentlich nicht so gerne (nur bei Funktoren), da ich das nicht so übersichtlich finde.

    Wenn du es in Set- und Get-Methoden aufteilst, brauchst du auch nicht Angst zu haben, dass etwas aus Versehen geändert wird. Denn gerade weil jedes Mal ein Eintrag erstellt wird, wenn er noch nicht vorhanden ist, kann es leicht passieren, dass man aus Versehen einen erstellt, wenn man nur lesen will.



  • Hallo,

    danke schon einmal für die Antwort!

    Die setter-Variante wäre meine Notlösung. Aber davon muss ich dann erstmal den überzeugen, der sich das ausgedacht hat 😉

    Wenn ich das mit der Referenz auf das Objekt mache, heißt das, dass ich dann ein Dummy-Objekt auch bei der Suchanfrage erstellen muss? Also sprich, wenn Verwaltung(a,b) einen nicht vorhandenen Wert anspricht. Oder kann ich irgendwie erreichen, dass bei dem ersten Funktionsaufruf ohne Zuweisung eine völlig andere Funktion aufgerufen wird, als beim Funktionsaufruf mit der Zuweisung?



  • Also wenn du etwas nicht findest, musst du ein Dummyobjekt zurückgeben, oder eine exception werfen.

    Ansonsten kannst du für die Zuweisung und das Abfragen die gleiche Funktion nutzen. Wenn du eine Überladung willst für die Abfrage, dann musst du wohl oder übel einen weiteren Dummyparameter übergeben, um anzuzeigen, welchen du willst.



  • Ok, und das wäre exakt etwas, was entgegen dem eigentlichen Ziel der ganzen Sache verläuft.

    Ich danke euch für eure Antworten, ihr habt mir sehr geholfen 🙂



  • Naja, man könnte ein Proxy-Objekt zurückgeben.

    Die Proxy-Klasse überlädt dann den operator =.
    Wenn nun ein nicht vorhandener Wert gesucht wird, kannst du damit immerhin verhindern, dass unnötigerweise ein Dummy-Objekt eingefügt wird. Wenn eine Zuweisung passiert, dann wird danach der operator = aufgerufen, und der kümmert sich in dem Fall dann darum, dass der entsprechende Eintrag gemacht wird.

    Ahja, die Proxy Klasse implementiert natürlich auch noch einen operator T (=implizite Konvertierung in den Typ T) - damit kann man dann auch T var = Suche(a, b); schreiben.

    p.S.: der operator T wird wohl eine Exception werfen müssen, wenn das Proxy-Objekt "leer" ist. Zusätzlich könntest du aber auch noch einen Operator boost::optional<T> definieren, der dann in dem Fall ein leeres boost::optional zurückgibt.



  • Hallo,

    noch eine Rückmeldung 🙂

    Ich habe das Problem geschildert und wir haben uns dafür entschieden es mit einer set-Funktion zu lösen. Das mit der Proxy-Klasse wäre zu viel Aufwand gewesen und hätte dann eine andere Sache torpediert. Aber grundsätzlich natürlich eine sehr schöne Lösung 🙂

    Danke nochmal für die Hilfe!



  • Kratzefunkel schrieb:

    Hallo,

    noch eine Rückmeldung 🙂

    👍

    Es ist die gängigste Lösung eines solchen Problems. - Daher bist du sicher einmal auf der sicheren Seite.;)



  • drakon schrieb:

    Daher bist du sicher einmal auf der sicheren Seite.;)

    Sicherlich sogar ganz sicher 😃 😃



  • jencas schrieb:

    drakon schrieb:

    Daher bist du sicher einmal auf der sicheren Seite.;)

    Sicherlich sogar ganz sicher 😃 😃

    [spam begrüdundung="ich darf auch mal"]Sich versichern versichert Unversicherte sicherlich.[/spam]


Anmelden zum Antworten