Was ist die beste Signatur für clone () in C ++?

Wie Scott Myers schrieb, können Sie eine Entspannung im Typensystem von C ++ nutzen, um clone () zu deklarieren und einen Zeiger auf den tatsächlich deklarierten Typ zurückzugeben:

class Base
{
    virtual Base* clone() const = 0;
};

class Derived : public Base
{
    virtual Derived* clone() const
};

Der Compiler erkennt, dass clone () einen Zeiger auf den Typ des Objekts zurückgibt, und ermöglicht es Derived, diesen zu überschreiben, um einen Zeiger auf derivative zurückzugeben.

s wäre wünschenswert, clone () einen intelligenten Zeiger zurückgeben zu lassen, der die Übertragung der Besitzersemantik impliziert, wie

class Base
{
   virtual std::auto_ptr<Base> clone() const = 0;
};

class Derived : public Base
{
    virtual std::auto_ptr<Derived> clone() const;
};

Leider gilt die Lockerung der Konventionen nicht für Smart Pointer mit Vorlagen, und der Compiler lässt das Überschreiben nicht zu.

Also, es scheint, ich habe noch zwei Möglichkeiten:

Have clone () gibt einen "dummen" Zeiger zurück und dokumentiert, dass Clients dafür verantwortlich sind, ihn zu entsorgen.Have clone () gibt einen Smart-Base-Zeiger zurück, und die Clients verwenden dynamic_cast, um sie bei Bedarf in einem abgeleiteten Zeiger zu speichern.

Ist einer dieser Ansätze bevorzugt? Oder gibt es eine Möglichkeit für mich, die Semantik der Übertragung von Inhabern zu nutzen und auch meine starke Typensicherheit zu gewährleisten?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage