operator() überladen



  • Hallo,

    ich würde gerne den Operator () für eine Bildklasse überladen, um auf Pixel an einer bestimmten Position zugreifen zu können (schreiben/lesen). Ich finde leider nichts zu diesem speziellen Operator (insbesondere Rückgabewerte). Aus dem Bauch heraus würde ich jetzt sowas machen:

    // Lesezugriff
    int image_class::operator()(unsigned int row, unsigned int col) const;
    
    // Schreibzugriff
    int& image_class::operator()(unsigned int row, unsigned int col);
    

    Liege ich damit richtig?

    Vielen Dank und viele Grüße, mbu.



  • Da die Schreibweise mit Klammern eigentlich immer impliziert, dass das was da aufgerufen wird "sowas wie ne Funktion" ist, würde ich eher davon abraten den op() zu dem von dir beabsichtigten Zweck zu überladen. Es wäre einfach unintuitiv:

    image_class image;
    /*...*/
    image(5,6) = 10; //sieht komisch aus
    int i = image(3,6); //sieht aus als ob da was berechnet wird
    

    Die einfachste Version wäre eine Funktion getPixel, ebentuell auch Überladen des operator[] mit zwei Argumenten.
    ewtas komplizierter (aber evtl. "natürlicher" und leichter verständlich) wäre ein Zugriff nach art eines doppelt indizierten Arrays:

    image_class image;
    /*...*/
    image[5][6] = 10;
    int i = image[3][6]
    

    Für die Lösung wäre eine Reihen-Proxyklasse nötig (nette kleine Übung)



  • pumuckl schrieb:

    [...]ebentuell auch Überladen des operator[] mit zwei Argumenten.[...]

    Sowas geht?



  • Tachyon schrieb:

    pumuckl schrieb:

    [...]ebentuell auch Überladen des operator[] mit zwei Argumenten.[...]

    Sowas geht?

    Leider nicht, da hab ich mich auch schon darüber geärgert. Was ist eigentlich der Grund, dass das nicht geht? Es wäre ja wohl nicht allzu schwierig, sowas zu implementieren, und wenn man gerade dabei ist (C++0x)...



  • std::vector<std::vector<long> > v;
    // Zugriff:
    long val = v[1][2];
    


  • simon.gysi schrieb:

    std::vector<std::vector<long> > v;
    // Zugriff:
    long val = v[1][2];
    

    Und?



  • simon.gysi schrieb:

    std::vector<std::vector<long> > v;
    // Zugriff:
    long val = v[1][2];
    

    Welcher Operator soll deiner Meinung nach nun für zwei Argumente überladen sein?

    Wir meinten viel eher so was:

    Table[3,4] = 72;
    


  • Hallo,

    Nexus schrieb:

    Wir meinten viel eher so was:

    Table[3,4] = 72;
    

    Und was ist mit dem Komma-Operator? Nein, das wäre nicht gut...

    MfG,

    Probe-Nutzer



  • Probe-Nutzer schrieb:

    Und was ist mit dem Komma-Operator? Nein, das wäre nicht gut...

    Für skalare Typen (in diesem Falle int ) kann man sowieso keine Operatoren überladen. Aber selbst wenn es ginge, würde es mit dem Komma-Operator ein Riesengefrickel werden, womöglich müsste man noch Klammern um den Ausdruck schreiben. Dann lieber eine Funktion.



  • Nexus schrieb:

    Probe-Nutzer schrieb:

    Und was ist mit dem Komma-Operator? Nein, das wäre nicht gut...

    Für skalare Typen (in diesem Falle int ) kann man sowieso keine Operatoren überladen. Aber selbst wenn es ginge, würde es mit dem Komma-Operator ein Riesengefrickel werden, womöglich müsste man noch Klammern um den Ausdruck schreiben. Dann lieber eine Funktion.

    Davon abgesehen, sollte man lieber die Finger vom operator, lassen. 😉



  • Vielen Dank für die Antworten. Habe mich für eine Variante entschieden. 😃



  • mbu schrieb:

    Vielen Dank für die Antworten. Habe mich für eine Variante entschieden. 😃

    Für welche? 😉



  • Nexus schrieb:

    mbu schrieb:

    Vielen Dank für die Antworten. Habe mich für eine Variante entschieden. 😃

    Für welche? 😉

    Für meine eigene. Da da keine Einwände kamen (ausser vllt. schlechter Stil), benutz ich erstmal diese Variante.


Anmelden zum Antworten