2012-04-01 4 views
0

Also habe ich ein gutes Stück googeln versucht, um herauszufinden, ob es einige beste Smart-Zeiger, um dies zu handhaben, aber ich habe nicht in der Lage, sich auf eine gute Wahl.welche Art von Zeiger für eine eigene Sammlung von Zeigern zu verwenden

struct Car 
{ 
    int m_doors; 
    int m_headlights; 
    //etc.. 
} 

Lets sagen, ich habe einige Klasse Auto. Ich habe auch eine std::map<int carkey, Car*> das ist die JunkYard.

Ein Auto * kann zu dem JunkYard von einem Fahrer hinzugefügt werden, der Fahrer selbst hat das Auto neu, aber der Fahrer verliert sofort alle Verantwortung des Autos *.

Ich möchte, dass der JunkYard für all seine Autos verantwortlich ist. Autos im JunkYard können von Leuten benutzt werden, um Teile zu entfernen und Altmetall aus dem Auto zu nehmen, oder zerquetscht zu werden, aber der JunkYard zerstört es für immer.

Am Ende des Tages zerstört der JunkYard alle seine Autos und schaltet sich ab.

-

A) Wenn dies ein Multi-Thread-App waren, wo Treiber Autos gleichzeitig zugreifen können, während die JunkYard Autos zerstören könnte ich dachte, dass wahrscheinlich ein shared_ptr wäre am besten? Ist das aber Overkill? Andere Threads können auf das Auto zugreifen, aber sie werden niemals langfristige Eigentümer davon sein, es muss immer dem JunkYard gehören.

B) Wenn dies single threaded wäre, wäre die beste Wahl - vorausgesetzt, es ist immer noch eine Karte < some_smart_car_ptr>. Ich möchte, dass der Container das Auto nimmt, um die Autos selbst zu löschen. Wenn Sie beispielsweise map.erase (...) aufrufen, sollte der Zeiger gelöscht und aus der Karte entfernt werden.

+0

Was ist 'Karte '? Wenn das aus irgendeinem Grund nicht funktioniert, würde ich vorschlagen: map > '. – Philipp

+0

Vielen Dank für diesen Vorschlag, mit der Karte und Einfügen in die Karte könnte dazu führen, dass die Neuordnung und damit das Kopieren und Verschieben von Autos richtig? Ist unique_ptr möglich, auf unique_ptr zuzugreifen, indem es als ref übergeben wird? Ich werde in diese – skimon

+0

schauen unique_ptr ist C++ 11 richtig? Ich habe keinen Zugang dazu. – skimon

Antwort

0

Smartpointer werden definitiv bevorzugt. Sehen Sie sich boost :: shared_ptr für eine Header-only-Lösung an, die gut skaliert (und in TR1 & C++ 11/C++ 0x ist).

boost::unordered_map<int carKey, boost::shared_ptr<Car *> > myCollection; 

Dann instanziieren Sie ein neues shared_ptr immer wenn Sie die Daten referenzieren, um die Referenzzahl zu erhöhen. Das allein verhindert eine vorzeitige Löschung. Stellen Sie sicher, dass Sie die Erfassungsfunktion für die Zeigererfassung & innerhalb eines Bereichs-Mutex sperren. Ein Verfahren zur Herstellung solcher wie:

boost::shared_ptr<Car *> CarManager::get(int carKey) { 
    boost::mutex::scoped_lock lock(mutex); 

    // ... etc ... // 
} 
+0

Verstanden, aber meine Frage ist - kann ich etwas anderes als ein shared_ptr verwenden. In diesem Fall kann nichts jemals ein Auto löschen, während der JunkYard es besitzt, also kann ich etwas Grundlegenderes (kein Ref-Zählen) verwenden, aber würde mir immer noch erlauben, vorübergehend den Zeiger für den Gebrauch zu bekommen? – skimon

+0

siehe: http://www.boost.org/doc/libs/1_49_0/libs/ptr_container/doc/ptr_container.html – pestilence669

Verwandte Themen