Angenommen, ich habe eine Einstellung mit Abstrakte Klasse ApplicatonBase, die eine unique_ptr auf eine andere abstrakte Klasse Document hat:Factory Method-Muster mit unique_ptr Mitglied einer abstrakten Klasse und Copy-Konstruktor
class ApplicationBase
{
public:
void factoryMethod()
{
_doc->doSomething();
};
protected:
std::unique_ptr<DocumentBase> _doc;
};
class DocumentBase
{
public:
virtual void doSomething() = 0;
};
Nun entwickle ich konkrete Klassen RichDocument und RichApplication wie folgt:
class RichDocument : public DocumentBase
{
public:
void doSomething() override
{
std::cout << "I'm rich document\n";
}
};
class RichApplication : public ApplicationBase
{
public:
RichApplication()
{
_doc = std::unique_ptr<RichDocument>(new RichDocument());
}
RichApplication(const RichApplication& other)
{
/*
* TODO: I want to copy the data from other document
* unique_ptr and give it to the current document
* unique_ptr
*/
//Following crashes as the copy constructor is not known:
// error: no matching function for call to ‘RichDocument::RichDocument(DocumentBase&)
//_doc.reset(new RichDocument(*other._doc));
}
};
Das Problem liegt im Kopierkonstruktor. Ich möchte die Daten im Copy-Konstruktor im unique_ptr tiefkopieren. Gibt es eine Möglichkeit, das zu tun? Oder sollte ich meine Struktur ändern? Jede Hilfe wäre willkommen.
Sie ein virtuelles definieren 'unique_ptr Document :: Klon () 'Methode. Oder Sie können statische Polymorphie verwenden (zB 'template Klasse Anwendung {...} (beachten Sie, dass der Wechsel zu statischem Polymorphismus eine große Entscheidung ist, die eine völlig andere Art der Strukturierung Ihres Codes erfordert) –
enobayram
@enobayram Siehe folgendes übrigens: 'Klasse Document { ... virtuellen std :: unique_ptr clone() const { return std :: unique_ptr (neu Document (* this)); }; }; ' und ' Klasse RichDocument: public DocumentBase { ... virtuelles std :: unique_ptr clone() const { Rückkehr std :: unique_ptr (neues RichDocument (* this)); } }; ' Bit Compiler Fehler: kann kein Objekt vom abstrakten Typ 'DocumentBase' zuordnen. Dies liegt an der reinen virtuellen Funktion. Irgendeine Problemumgehung? –
@enobayram Auch wenn in den obigen Clone-Methoden, ich die Abstraktheit der Klasse entfernen, habe ich den folgenden Fehler: ungültige Kovariante Rückgabetyp für 'virtuelle Std :: unique_ptr RichDocument :: clone() –