2017-12-21 1 views
-1

Ich spiele herum mit Überlastung des Operators in meiner geerbten Klasse. Es funktioniert gut, wenn ich den überladenen Operator in einer einzelnen Klasse definiere (+ im Beispiel unten). Allerdings kann ich es nicht mit Polymorphismus funktioniert ([]) - Ich erhalte die FehlermeldungenPolymorphismus und überladene Operatoren

main.cpp:70:36: error: ‘int A::operator[]() const’ must take exactly one argument 
    virtual int operator[]() const = 0; 
            ^
main.cpp:80:28: error: ‘int B::operator[]() const’ must take exactly one argument 
    virtual int operator[]() const { return b; } 
          ^~~~~ 
main.cpp: In function ‘int main()’: 
main.cpp:90:25: error: expected primary-expression before ‘]’ token 
    std::cout << (*a_ptr)[] << "\n"; 

Hier ist der Code:

#include <iostream> 

class A 
{ 
public: 
    A(){}; 
    virtual ~A(){}; 
    virtual int operator[]() const = 0; 
}; 

class B : public A 
{ 
private: 
    int b; 

public: 
    B(int b_) : b(b_){}; 
    virtual int operator[]() const { return b; } 
    int operator+(const B &rhs) const { return b + rhs.b; } 
    int get() { return b; } 
}; 

int main() 
{ 

    ///this gives an error: 
    A *a_ptr = new B(100); 
    std::cout << (*a_ptr)[] << "\n"; 

    ///this works fine 
    B a(10), b(100); 
    std::cout << a.get() << "\n"; 
    std::cout << b.get() << "\n"; 
    b = a + b; 
    std::cout << b.get() << "\n"; 

    return 0; 
} 

Ist das [] -Operator speziell, da es genau ein Argument nehmen müssen ?

+5

Das Problem hat nichts mit Polymorphie zu tun. Hast du * die * Fehlermeldung gelesen? Was sagt es? Und wie würden Sie den "* index * operator" verwenden, ohne einen Index anzugeben? Sie können die Syntax der Sprache nicht durch Überladen des Operators ändern. Vielleicht sollten Sie stattdessen den Funktionsaufrufoperator ('operator()') überladen? –

+0

Ich bin ein bisschen verwirrt. Sie machen es richtig mit dem Operator + - Sie geben es ein Argument, wie es sollte. Warum machen Sie nicht dasselbe mit dem Operator [], der auch ein Argument für den Index benötigt - da muss etwas dazwischen sein [];) – user2328447

+0

@ user2328447 Eigentlich ist die 'operator +' Funktion nicht * wirklich * richtig implementiert. Es sollte "B" nach Wert zurückgeben. Es ist nicht ungültig, die Semantik der Operatoren zu ändern, aber es wird dringend empfohlen, dies nicht zu tun. Zum Beispiel ist es momentan nicht möglich, z.B. 'some_b_object + another_b_object + a_third_b_object'. –

Antwort

2

Laut this Erklärung, der Array-Index-Operator muss ein Argument, das auch durch die Fehlermeldung angezeigt wird; scheinbar unterschiedliche Signaturen sind für den Array-Subscript-Operator nicht möglich.