4 Stimmen

Vektor von Zeigern auf Objekte, benötigen eine tiefe Kopie des Vektors, aber die Objekte sind die Basis der geerbten Objekte

Ich möchte eine tiefe Kopie eines Vektors mit Zeigern auf Objekte haben, aber das Objekt kann entweder C oder B sein. Ich weiß, verwirrend (die Art, wie ich es erkläre), lassen Sie mich illustrieren.

class A {
    A(const A& copyme) { }
    void UnableToInstantiateMeBecauseOf() =0;
};

class B {
    B(const B& copyme) : A(copyme) {}
};

class C {
    C(const C& copyme) : A(copyme) {}
};

std::vector<A*>* CreateDeepCopy(std::vector<A*>& list)
{
    std::vector<A*>* outList = new std::vector<A*>();

    for (std::vector<A*>::iterator it = list.begin(); it != list.end(); ++it)
    {
        A* current = *it;
        // I want an copy of A, but it really is either an B or an C
        A* copy = magic with current;
        outList->push_back(copy);
    }

    return outList;
}

Wie erstellt man eine Kopie eines Objekts, von dem man nicht weiß, welcher vererbte Typ es ist?

4voto

Moo-Juice Punkte 37380

Klonen verwenden:

Objekt kopieren - Polymorphismus beibehalten

class Super
{
public:
    Super();// regular ctor
    Super(const Super& _rhs); // copy constructor
    virtual Super* clone() const = 0; // derived classes to implement.
}; // eo class Super

class Special : public Super
{
public:
    Special() : Super() {};
    Special(const Special& _rhs) : Super(_rhs){};
    virtual Special* clone() const {return(new Special(*this));};
}; // eo class Special

EDITAR:

Mir ist aufgefallen, dass die Basisklasse in Ihrer Frage abstrakt ist. Das ist in Ordnung, dieses Modell funktioniert immer noch, ich habe geändert.

2voto

frast Punkte 2660

Fügen Sie eine virtuelle Clone()-Methode zu Ihren Klassen hinzu.

A* copy = it->Clone();

class A {
    virtual A* Clone()
    {
        return new A(*this);
    }
};

Überschreiben Sie Clone in abgeleiteten Klassen. Die Implementierung ist die gleiche wie bei Klasse A.

2voto

Andreas Brinck Punkte 49116

Sie könnten eine rein virtuelle Klonfunktion in der Klasse A .

2voto

Daniel Lidström Punkte 8778

Wie andere bereits gesagt haben, benötigen Sie eine Art Klonierungsmechanismus. Vielleicht sollten Sie sich die cloning_ptr von Kevlin Henney in seinem ausgezeichneten Artikel Alleine klonen .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X