Refernzierter Rückgabewert als const rerenzierter Parameter?



  • Hi,

    es kann sein, dass meine Frage eher in das allgemeine C++ Forum gehört, da ich allerdings unter Visual C++ 2008 programmiere hielt ich es für richtig die Frage hier zu stellen.

    Ich habe einen Problem mit einem Compilerfehler. Zunächst aber erstmal die interessanten Stellen meines Codes:

    class CVektor
    {
    public:
       int& operator[](int n);
    }
    
    class CMatrix
    {
    public:
       CVektor& operator[](int n);
       CVektor mul(const CVektor& v);
    }
    
    //[...]
    
    CVektor CMatrix::mul(const CVektor& v) 
    {
       // [...]
       v[j];
       // [...]
    }
    

    Dieser Code produziert folgenden Compilerfehler:

    Fehler 1 error C2678: Binärer Operator '[': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'const CVektor' akzeptiert (oder keine geeignete Konvertierung möglich)

    Den Prototypen der Funktion so ändern, dass er keine "konstante Referenz" sondern eine Kopie des Objektes erhält, CVektor CMatrix::mul(CVektor v), würde zwar funktionieren, aber ich möchte das kopieren des Vektors Objektes wegen Performancegründen vermeiden und darum mit einer Referenz arbeiten. Dass die Referenz nicht verändert wird möchte ich mit dem cosnt Schlüsselwortz verdeutlichen.

    Weshalb genau kommt der Fehler und gibt es einen "fix", der mein Anliegen berücksichtigt?

    Danke im Voraus!

    ip

    PS: Kurze Frage an die, die bereits länger mit MSVC++ arbeiten. Gibt es eine Möglichkeit sich automatisch Definitions-Prototypen aus einer Klassen-Deklaration generieren zu lassen, oder muss ich das immer von Hand machen?



  • Damit dein überladener Operator [] der Klasse CVektor für konstante Objekte anwendbar ist, musst du hinter die Methode const schreiben. Damit stellst du sicher, dass sich ein Objekt der Klasse CVektor beim Aufruf der Methode operator[] intern nicht verändert (in Bezug auf dessen Membervariablen). Gleichzeitig machst du auch den Compiler glücklich, da er nun weiss, dass das (konstante) Objekt nach dem Aufruf wirklich unverändert bleibt. Veränderst du eine Membervariable in einer konstanten Methode, wird dich der Compiler darauf hinweisen, dass das nicht gestattet ist.

    int& operator[](int n) const;
    

    Als Alternative könntest du einen const_cast auf v anwenden, sprich das const von v wegcasten, was ich jedoch nicht empfehlen würde.

    Gibt es eine Möglichkeit sich automatisch Definitions-Prototypen aus einer Klassen-Deklaration generieren zu lassen

    In MSVC++ ist mir bisher noch keine derartige Funktion aufgefallen, was nicht heisst, dass es diese Automatik nicht gibt.



  • ip schrieb:

    es kann sein, dass meine Frage eher in das allgemeine C++ Forum gehört, da ich allerdings unter Visual C++ 2008 programmiere hielt ich es für richtig die Frage hier zu stellen.

    Es kann nicht nur sein, sondern ist so. Hier geht es um die MFC. Das was du hier machst hat aber nichts mit dieser zu tun.

    Daher in Zukunft: Wenn es nicht MFC-Spezifische Punkte betrifft, zuerst einmal an das C++ Unterforum denken...

    ip schrieb:

    PS: Kurze Frage an die, die bereits länger mit MSVC++ arbeiten. Gibt es eine Möglichkeit sich automatisch Definitions-Prototypen aus einer Klassen-Deklaration generieren zu lassen, oder muss ich das immer von Hand machen?

    Dies kenne ich nur von Plugins (die nicht unter der Expressedition laufen) im Refactoringbereich.

    cu André



  • Hi,

    asc: könntest du mir da was an Plugins empfehlen? Ich habe durch meine Universität Zugriff auf eine Professional Lizenz und somit auch Plugin Funktionalität. Leider war meine google Suche nicht besonders ergiebig.

    Grüße,
    ip

    PS: Vielen Dank, Pointer!
    PPS:

    int& operator[] (int n) const;
    

    Leider ist es nicht möglich aus einer konstanten Methode eine Referenz auf eine Membervariable zurück zu geben. Das hatte ich bereits vermutet / befürchtet. Wie dem auch sei, ich werde einfach das const aus der Aufrufenden Funktion entfernen und so dem Problem aus dem Weg gehen.



  • ip schrieb:

    asc: könntest du mir da was an Plugins empfehlen? Ich habe durch meine Universität Zugriff auf eine Professional Lizenz und somit auch Plugin Funktionalität. Leider war meine google Suche nicht besonders ergiebig.

    Die meisten Plugins die ich verwende sind Kostenpflichtig, die zwei mir bekanntesten sind:

    • Visual Assist X (Kostenpflichtig; Verbessertes Intellisense, Refactoring...)
    • Refactor! for C++ (Kostenlos, es gibt aber auch eine kostenpflichtige umfassendere Version)

    Zudem bin ich bei google auf diese Liste gestoßen...

    Zudem setzte ich noch 2 Produkte ein die nur zur Integration weiterer Tools dienen (UML sowie mhh... Fehlerfinder wäre wohl ein passender Ausdruck).

    cu André


Anmelden zum Antworten