2010-03-05 27 views
5

Ich habe einen Fall, wo ich eine Liste von Ressourcen in einem Std :: Vector speichern möchte. Wie ich es sehe, sind meine Optionen wie folgt:RAII und C++ STL

  1. Konstruktor ein Standard Geben Sie meine Ressource
  2. speichern sie als Heap-Objekte (und sie in einem gemeinsamen Zeiger wickeln)

Option 1 macht es möglich, ungültige Ressourcen zu konstruieren und Option 2 zwingt mich, den Heap zu verwenden.

Fehle ich hier irgendwelche Optionen?

+1

Warum möchten Sie die Ressourcen standardmäßig ctor geben? Vektor erfordert nur Kopie ctor. – Naveen

+2

"Option 2 zwingt mich, den Heap zu verwenden" - nun, der Vektor wird auch seine Sachen auf dem Heap speichern (es sei denn, Sie verwenden einen benutzerdefinierten Zuordner), obwohl im zusammenhängenden Speicher. Sie können also den Heap nicht auf die eine oder andere Weise umgehen. –

+0

festgestellt, dass ich eine Referenz in meiner Ressource gespeichert wurde, so das Problem war nicht der Standardkonstruktor thx – dirk

Antwort

7

Sie benötigen keinen Standardkonstruktor, um einen Vektor von Instanzen zu haben.

Die einzige Einschränkung ist, dass Sie vector :: resize nicht mit dem Standardargument verwenden können, wenn die Klasse keinen Standardkonstruktor hat.

vec.resize(20); // requires default constructor 

aber Sie können Vektor geben :: Ändern der Größe eines Standard-Objekt:

std::vector<foo> vec; 
vec.resize(20, foo(10)); // give a sample object since foo has not default constructor 
1

Sie speichern können Objekte mit nicht trivial Konstruktor in Vektor. Der Objektspeicher in STL-Containern sollte eine Zuweisungssemantik haben (Kopierkonstruktor und Zuweisungsoperator).

1

Eine dritte Option wäre Boost.PointerContainer zu verwenden. Ihre Objekte werden jedoch weiterhin auf dem Heap einzeln zugewiesen. Wie Johann bemerkt hat, verwendet std :: vector bereits den Heap, um Objekte (zusammenhängend) zu speichern, so dass es keine Möglichkeit gibt, den Heap komplett zu vermeiden.

Es ist oft nicht sinnvoll, Ressourcen (wie Mutexe, E/A-Streams usw.) Kopiersemantik zu geben. Sie müssen daher nicht kopierbar gemacht werden, indem der Kopierkonstruktor und der Zuweisungsoperator privat gemacht werden. Leider macht es die nicht kopierbare Einschränkung unmöglich, Ressourcen direkt als Werte in STL-Containern zu speichern. Man muss daher entweder auf Boost.PointerContainer oder Container von Smartpointern zurückgreifen. Der Abschnitt Motivation der Boost.PointerContainer-Dokumentation erklärt, warum Sie lieber einen über den anderen verwenden möchten.