2012-08-30 6 views
5

Ich habe eine Schleife, in der ich eine Funktion verwende, die std :: unique_ptr an ein Objekt einer abstrakten Klasse zurückgibt. Ich möchte diese Objekte über push_back in einen std :: vector speichern. Da aber die Objekte der abstrakten Art sind bekomme ich folgende Fehlermeldung:Wie speichert man einen Vektor von Objekten einer abstrakten Klasse, die durch std :: unique_ptr gegeben sind?

error: cannot allocate an object of abstract type 

für die Linie

cells.push_back(std::move(*cell)); 

wo Zellen ist ein std::vector der abstrakten Art und cell vom Typ

std::unique_ptr<AbstractType>&& cell 

(Ich übergebe tatsächlich cell an eine Handler-Klasse) Ich weiß, dass man einen abstrakten Typ und wie ich nicht instanziieren kann verstehe den std: move operator muss das Objekt irgendwie instanziieren?

Kann mir jemand helfen, das Problem zu lösen? Oder sollte die Funktion (nicht mein Teil des Projekts) keinen eindeutigen Zeiger auf ein Objekt eines abstrakten Typs zurückgeben?

+6

Sprechen wir über einen 'Vektor '? Das wird nicht funktionieren. Speichern Sie stattdessen einen 'Vektor >'. –

+0

Sie haben Recht! Ich war blind, ich änderte es in 'vector >' und jetzt funktioniert es – soriak

+0

@ R.MartinhoFernandes: +1 auf Ihren Kommentar (das sollte eine Antwort sein). Du musst Gedanken lesen! –

Antwort

9

Sie können AbstractType Elemente nicht direkt auf einem std::vector speichern. Sie können die unique_ptr s selbst in einem std::vector<std::unique_ptr<AbstractType>> mit cells.push_back(std::move(cell)) speichern.

+0

Der Grund dafür ist, dass Sie den Kopierkonstruktor aufrufen und somit versuchen, eine abstrakte Klasse zu instanziieren. –

Verwandte Themen