2016-10-26 5 views
-2

Ich habe eine Beispiel-Map-Klasse, in der ich versuche, den tiefgestellten Operator zu überschreiben. Um Benutzern der Klasse das Lesen und Schreiben in die Map zu ermöglichen. Karte ["a"] wird gelesen, und Map ["a"] = "etwas" ist der Schreibvorgang der Klasse. Ich kann jedoch nicht herausfinden, wie die Zuweisungsoperatorseite der Dinge zu verwenden ist und einen übergebenen Wert zulassen, um sie zu ersetzen. Gerade jetzt, wenn ich versuche, einen neuen Wert zuweisen es liest nur „Segmentation fault“Überladen von tiefgestellten Operator

Hier ist, was ich bisher:

VALUE_TYPE& Map::operator[](KEY_TYPE a){ 
    cout << "hmm" << endl; 


} 



Map& Map::operator=(const Map &rhs){ 
    //cout << "operator = " << endl; 
} 

Im Moment habe ich keine von den Code .. wollte nur sehen, dass sie erfolgreich angerufen werden würden.

Was kann ich nicht scheinen, um herauszufinden, wenn ich etwas tun, wie

Map["a"] = "hey"; 

werde ich einen Segmentation Fault bekommen. Ich nahm an, dass der Zuweisungsoperator = aufgerufen würde, wenn ich einem bestimmten Schlüssel einen neuen Wert zuweisen wollte. Mache ich etwas falsch?

VALUE_TYPE und KEY_TYPE sind übrigens nur als Strings definiert, jedem Schlüssel ist ein Wert zugeordnet.

+0

Das richtige Werkzeug, um solche Probleme zu lösen, ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage bearbeiten, um ein [minimales, vollständiges und verifizierbares] (http://stackoverflow.com/help/mcve) Beispiel einzufügen, das Ihr Problem zusammen mit den Beobachtungen, die Sie in der Debugger. –

+0

Auf den ersten Blick. Der Operator sollte ein "Typ" und kein "Map" Recht nehmen? Weil 'Map [a]' ein Element in der Map zurückgeben würde. Keine Karte. Es sei denn, es ist eine Karte von Karten. –

+1

Der Operator = weist die gesamte Map zu, nicht ein einzelnes Element. –

Antwort

3

Sie weisen die Karte nicht dem Objekt zu, das von operator[] zurückgegeben wird.
(In m["a"] = "hey"; ist m["a"] kein Map, es ist ein VALUE_TYPE&.)

Der Bediener muss einen Verweis auf ein gültiges Objekt zurück, ansonsten ist das Verhalten nicht definiert ist.

Kleinste Beispiel ich mit oben kommen kann:

struct Mapp 
{ 
    int& operator[](int i) { return member; } 
    int member; 
}; 

int main() 
{ 
    Mapp m; 
    m[0] = 12; // Assigns 12 to m.member 
} 

Sie wollen auch die const Version des Betreibers zu überlasten.

+0

Wow, das ist sehr sinnvoll ... gab kein Objekt zurück, das zugewiesen werden konnte! Vielen Dank! –