Frage

Ich schreibe eine Hash-Tabelle für meine Daten structs Klasse, und ich möchte ein wenig syntaktischer Zucker meiner Implementierung hinzuzufügen.

template <typename HashedObj, typename Object>
Object & Dictionary<HashedObj, Object>::operator[](HashedObj & key)
{
  return items.lookup(key);
}

Das funktioniert gut, wenn ich so etwas wie cout tun << dict [ "MyKey"]. Aber wie kann ich tun Zuordnung mit den Klammern So etwas wie:

dict["mykey"] = "something";

Und nein, das ist nicht Teil meiner Hausaufgabe (kein Wortspiel beabsichtigt), ich möchte nur C ++ ein wenig besser kennen zu lernen.

War es hilfreich?

Lösung

Es ist nicht klar, was genau Sie hier fragen. Der Code, den Sie präsentierten bereits unterstützt Zuordnung. Tun Sie es einfach und funktioniert (oder zumindest sollte es kompilieren). Es macht absolut keinen Unterschied, welche Seite des Zuweisungsoperators Ihre überlastet [] auf verwendet wird. Es funktioniert in genau die gleiche Art und Weise auf der linken Seite (LHS), wie es funktioniert auf der rechten Seite (RHS) die Abtretung (oder als Operand <<, wie in Ihrem ursprünglichen Post). Ihre [] gibt einen Verweis auf eine Object, und dann die tatsächliche Zuordnung wird durch den Zuweisungsoperator Ihrer Object Art behandelt, was bedeutet, dass die [] sich nicht wirklich in der eigentlichen Zuweisung beteiligt ist.

Die eigentliche Frage ist hier, wie Sie Ihre [] in bestimmten Sonderfällen handeln wollen. Was wird geschehen, wenn der Schlüssel nicht in der Tabelle vorhanden ist? Verweis auf welche Object ist Ihr lookup in diesem Fall zurück gehen?

Es ist impossibe aus, um herauszufinden, was Sie auf dem Laufenden. Ich sehe es einen Verweis zurückgibt, so NULL Rückkehr steht außer Frage. Hat setzen Sie sie ein neues, leeres Object für den gegebenen Schlüssel? Wenn ja, dann müssen Sie nichts tun. Ihr [] ist bereits perfekt bereit, auf der linke Seite von der assigment verwendet werden. (Dies ist, wie [] in std::map arbeitet, BTW)

Wenn Ihr lookup einen Verweis auf eine spezielle „guard“ Object zurückkehrt, haben Sie spezielle Schritte zu unternehmen. Sie wollen wahrscheinlich nicht, etwas zu einem „Wächter“ Objekt zuweisen, so dass Sie auf „disable“ sein Zuweisungsoperator irgendwie und Sie sind fertig. Der Rest sollte funktionieren wie es ist.

Wenn Ihr lookup eine Ausnahme im Falle eines nicht vorhandenen Schlüssel wirft, dann müssen Sie entscheiden, ob das ist, was Sie wollen, wenn die [] auf der LHS einer Zuweisung verwendet wird. Wenn ja, dann brauchen Sie nichts weiter zu tun. Wenn nicht, dann wird es einige zusätzliche Arbeit nehmen ...

Also, noch einmal, was passiert, wenn Sie einen nicht vorhandenen Schlüssel übergeben lookup?

P. S. Zusätzlich wäre es normalerweise mehr Sinn machen, den [] (und lookup) entweder mit const HashedObj& Parametern zu erklären oder einfach nur HashedObj Parametern. Nicht konstante Referenz, wie in Ihrem Beispiel sieht seltsam aus und könnte zu Problemen in einigen (eigentlich in den meisten) führt Fällen. Ich bin überrascht es für Sie arbeitet jetzt ...

Andere Tipps

Sie müssen, dass die 2-mal überlasten. Eines, das const werden, die der data access Teil sein werden, und eine, die einen Verweis zurück, die als „Setter“ handeln wird.

Was Sie suchen ist eine ähnliche Funktionalität wie dem überlasteten eckigen Klammern in std::map. In std::map führt der Bediener eine Halterung lookup und gibt eine Referenz auf ein Objekt mit einem bestimmten Schlüssel zugeordnet ist. Wenn die Karte enthält kein Objekt mit dem Schlüssel zugeordnet ist, setzt der Bediener ein neues Objekt in die Karte des Standardkonstruktor verwenden.

Wenn Sie also std::map<K,V> mymap haben, dann wird Aufruf mymap[someKey] entweder zurückgeben einen Verweis auf den Wert mit someKey verbunden ist, oder es wird ein neues Objekt vom Typ V erstellen durch den Aufruf V() (das Standard-Konstruktor von V) und dann wieder Verweis auf dieses neue Objekt, das der Anrufer ermöglicht, einen Wert für das Objekt zuzuweisen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top