2010-12-09 18 views
2

Ich suche in einem Verweis auf eine Karte passieren und NICHT Karte Ort, um es woanders haben - Hier ist, was mit ich arbeite:Pass in Bezug auf eine in C++

map<string, Node> _neighbors; // Instance Variable 


Node& neighbor(Node& neighbor) { 
    cout << "HOST: "<< neighbor.host() << " ADDRESS: " << &neighbor << endl; 
    string key = this->getKey(neighbor); 

    if(!_neighbors.count(key)) { 
     _neighbors[key] = neighbor; 
     cout << "HOST (AFTER): "<< _neighbors[key].host() << " ADDRESS: " << &_neighbors[key] << endl; 
     neighbor.neighbor(*this); 
    } 

    return *this; 
} 

Ausgang: Wenn ich rufe n1.neighbor(n2); // n1 is a Node with host=1 and n2 is a Node with host=2

HOST: 2-ADRESSE: 0x7fff5fbfe580

HOST (AFTER): 2-ADRESSE: 0x100100128

+0

... Und ** warum ** genau brauchen Sie das? –

+0

Ich musste in der Lage sein, Dinge aus Nachbarn herauszuholen, sie zu aktualisieren und sie in dem ursprünglich instanziierten Knoten widerzuspiegeln. – Matt

Antwort

4

Sie können keine Referenzen speichern i n einem STL-Container. Container speichern Objekte und Referenzen sind keine Objekte (außerdem müssen die in einem Container gespeicherten Objekte zuweisbar sein und Referenzen nicht zuweisbar sein).

Sie eine Karte von Zeigern verwenden möchten:

std::map<std::string, Node*> 

Auch Eigentumsfragen in Acht nehmen. Sie müssen sicherstellen, dass die Objekte nicht zerstört werden, bis alle Personen, die einen Verweis auf sie haben, damit arbeiten. Wenn Sie Objekte an mehreren Stellen verwenden, sollten Sie einen Smart-Zeiger für den gemeinsamen Besitz wie shared_ptr verwenden, um die Objektlebensdauern für Sie zu verwalten. Die manuelle Ressourcenverwaltung in C++ ist mit Gefahren verbunden und sollte um jeden Preis vermieden werden.

+0

Auch wenn Sie keine Objekte an mehreren Stellen verwenden, ist es (fast) immer besser, intelligente Zeiger in STL-Containern zu verwenden. Da ein nativer Zeiger keinen Destruktormechanismus hat, um ihn zu befreien, kann jede der containerbasierten "Entfernungs" -Operationen einen impliziten Speicherverlust aufweisen, es sei denn, der Programmierer ist sich dessen bewusst und ist sehr vorsichtig, dh keine Verwendung von Algorithmen, die Bereiche usw. entfernen – dlanod

+0

@dlanod: Ganz richtig. Ich nahm an, dass die Karte hier weder für den Besitz von Objektlebenszeiten noch für die gemeinsame Verantwortung mit etwas anderem verantwortlich war; das mag eine schlechte Annahme gewesen sein. –

+0

Vielen Dank für Ihre Antwort - Ich denke, ich werde einen anderen Ansatz versuchen, weil ich wirklich nicht gut in diesem Zeug bin. * Eine Frage: Ich weiß, dass Parameter nach Wert kopiert werden, aber geben Methoden Werte oder Referenzen zurück? * – Matt