2016-06-22 8 views
0

Ich möchte eine HashMap in C++ verwenden, wo die gespeicherten Objekte Instanzen einer benutzerdefinierten Klasse sind. Diese benutzerdefinierte Klasse hat nur einen Konstruktor mit einem Parameter, den ich festlegen muss.Standardwert in einer HashMap für eine benutzerdefinierte Klasse in C++

Die HashMap ermöglicht es, den Standardwert der darin enthaltenen Objekte über ihren Konstruktor zu setzen: HashMap(const mapped_type &v).

Das Problem ist, dass ich nicht sicher bin, wie man es benutzt.

Nehmen wir an, meine benutzerdefinierte Klasse heißt Foo und muss einen int an ihren Konstruktor übergeben.

Wenn ich möchte, dass alle Objekte in der HashMap mit dem Wert 3 instanziiert werden, sollte ich so etwas tun?

HashMap<String, Foo> myMap(Foo(3)); 

Ist es erforderlich, eine Kopie Konstruktor in Foo zu implementieren?

Edit: Ich muss diese bestimmte HashMap und daher den angegebenen Konstruktor verwenden, um den Standardwert zu behandeln.

+0

Bitte zeigen Sie den Code, den Sie bisher haben (oder ein [mvce] (https://stackoverflow.com/help/mcve)) – Patryk

Antwort

2

diese

HashMap<String, Foo> myMap(Foo(3)); 

funktionieren soll, sind Sie ein temporäres Objekt der Klasse Foo erstellen und es in die const Foo & Bindung, dass die HashMap im Konstruktor Dies erlaubt ist.

Wenn nun HashMap beim Einfügen von Standardwerten von einem gespeicherten Standard-Foo-Member kopiert, dann benötigt Foo einen Kopierkonstruktor. Denken Sie daran, dass der Compiler einen Kopierkonstruktor für Sie generiert und Sie sollten nur dann einen eigenen schreiben, wenn Sie besondere Vorsicht walten lassen müssen (z. B. wenn einige der Elemente dynamisch zugeordnet sind)

1

Standardkonstruktors definieren für foo:

class foo 
{ 
public: 
    foo() {value = 3;}; 
    int value; 
}; 

std verwenden, mit std :: string als Schlüssel und foo als Wert:

std::unordered_map<std::string, foo> hashMap = std::unordered_map<std::string, foo>(); 

std::cout << hashMap["newValue"].value; 

Es wird Ausgang 3;

+0

Geben 3 zu Foo war nur ein Beispiel, in der Tat, ich muss es einen Zeiger geben, der sich ändern kann (aber muss von allen Objekten geteilt werden in der HashMap). Außerdem muss ich diese spezielle HashMap verwenden, um die Daten zu speichern. – rgaillard

+0

Ok, dann musst du etwas mehr über HashMap teilen. Es kann sein, dass es bereits tut, was Sie wollen, was bedeutet, wenn Sie versuchen, auf ein Objekt unter einem Schlüssel zuzugreifen, der nicht in HashMap ist, fügt es eine Kopie von Standard ein und gibt sie dann zurück. – MaciekGrynda

+0

Ja, das tut es tatsächlich. Meine Frage war mehr über die Übergabe "Foo (3)" für den Standardwert und wenn es einen Kopierkonstruktor in Foo benötigt. Die Frage ist also mehr C++ als diese HashMap. – rgaillard