error C2106: '=': Linker Operand muss ein L-Wert sein <---- Frage



  • Ich habe folgende Klasse:

    class Foo
    {
    public:
    char* gWordPtr(){return pcWord;);
    
    void foo();
    
    private:
    char* pcWord;
    }
    

    Wenn ich jetzt in einer weiteren Methode pcWord ändern will:

    .....
    void Foo::foo()
    {
        foo()=new char;
    }
    

    bekomme ich die Fehlermeldung

    error C2106: '=': Linker Operand muss ein L-Wert sein
    

    Ich habe gegoogled, aber das beantwortet nicht meine Frage.
    Warum ist es nicht möglich auf einen Rückgabewert ein new anzuwenden?



  • foo() ist void -> also kein Rückgabewert!

    Da kannst du keinen Wert zuweisen 🙂



  • vielleicht so gehts?
    [cpp]
    void Foo::foo()
    {
    int anz = 100;
    pcWord = new char[anz];
    }



  • und den Rückgabewert einer Funktion bestimmst du mit return, und nicht indem du versuchst der Funktion einen Wert zuzuweisen.

    foo()=new char;
    

    Wie kommt an überhaupt auf sowas 😉



  • ....*schäm* ich habe mich vertan es muss natürlich

    .....
    void Foo::foo()
    {
        this->gWordPtr()=new char;
    }
    

    heißen.

    Wenn man es so hat kommt der Fehler



  • das müsste eigentlich wenn, dann so aussehen:

    class Foo
    {
    public:
    char* gWordPtr(){return pcWord;);
    
    void foo();
    
    private:
    char* pcWord;
    }
    

    und...

    .....
    void Foo::foo()
    {
        pcWord()=new char[256]; // nich die Dimension vergessen...
    }
    


  • Weil du einen temporären Zeiger zurückbekommst und temporären Objekten (und Zeigern) kann man nichts zuweisen. Der Zeiger zeigt zwar auf den gleichen Speicherbereich wie dein anderer Zeiger, wenn du diesem aber mit new etwas zuweisen wollen würdest, würdest du deinen temporären Zeiger verändern und nicht den ursprünglichen Zeiger. Ein zusätzlicher Zeiger sollte dies verdeutlichen:

    void Foo::foo()
    {
        char *tmp = this->gWordPtr()
        tmp = new char;
    }
    

    So geht es, allerdings bleibt der Zeiger pcWord davon unbeeinflusst, nur tmp zeigt auf einen neuen Speicherbereich, den du aber auch gleich wieder nach beenden der Funktion verlierst (und dazu hast du noch ein Speicherleck, weil da kein delete ist).

    Hoffe das war verständlich.

    Greetz



  • Äh, sorry...
    so:

    .....
    void Foo::foo()
    {
        pcWord=new char[256]; // nich die Dimension vergessen...
    }
    

    ohne die () Klammer...

    Dabei bitte die Member-Variable ansprechen - nich die Funktion...



  • Winnie01 schrieb:

    und...

    .....
    void Foo::foo()
    {
        pcWord()=new char[256]; // nich die Dimension vergessen...
    }
    

    Das geht genausowenig. Ob man ein einfaches new char oder ein new char mit Dimensionsangabe macht ist egal. Und wenn ich nur 1 char speichern will mache ich bestimmt keine Dimensionsangabe dort hin.

    Greetz



  • ja, o.k...

    je nach Problemstellung muß man auch eigentlich wissen, was man erreichen will...


Anmelden zum Antworten