2009-05-20 18 views
1

Ich habe einen Bibliothekscode (ich kann den Quellcode nicht ändern), der einen Zeiger auf ein Objekt (B) zurückgibt. Ich mag diesen Zeiger als shared_ptr mit dieser Art von Konstruktor unter einer Klasse speichern:Zeiger auf shared_ptr konvertieren

class A 
{ 
    public: 
    A(boost::shared_ptr<B> val); 
    ... 
    private: 
    boost::shared_ptr<B> _val; 
    ... 
}; 

int main() 
{ 
    B *b = SomeLib(); 
    A a(b); //?? 
    delete b; 
    ... 
} 

Das heißt, würde ich eine tief Kopie von b machen möchte und kontrollieren ihre Lebenszeit unter einem (auch wenn Original b ist gelöscht (delete b), ich habe immer noch eine genaue Kopie unter a).

ich neu in diesem bin, traurig, wenn es scheint trivial ...

Antwort

2

Wie Sie sagen, Sie haben sie kopieren nicht nur einen Zeiger kopieren. Entweder hat B bereits die "Klon" -Methode implementiert oder Sie müssen eine externe B* copy(B* b) implementieren, die ein neues B mit demselben Status erzeugt.

Bei B hat Copykonstruktor implementiert Sie Kopie als nur

B* copyOf(B* b) 
{ 
    return new B(*b); 
} 

Im Fall B clone method or similar Sie Kopie als

B* copyOf(B* b) 
{ 
    return b->clone(); 
} 

und dann wird Ihr Code aussehen

implementieren kann implementiert implementieren
int main() 
{ 
    B *b = SomeLib(); 
    A a(copyOf(b)); 
    delete b; 
    ... 
} 
+0

Ich sehe nicht die Verwendung der Funktion "kopieren" ... –

+0

zweite Zeile in der Hauptfunktion. –

+0

@Mykola: Ich sehe es - aber ich verstehe es nicht: es macht einfach keinen Sinn. Es tut uns leid. –

1

Tiefkopieren ist trivial in C++ implementiert durch den Kopierkonstruktor, da in C++ alle Objekte Wert Semantik standardmäßig haben. Das Kopieren auf solche Weise funktioniert jedoch nicht für polymorphe Objekte - in solchen Fällen müssten Sie eine praktisch überschriebene clone Methode in Ihrer Klasse implementieren.

Aber in allen anderen Fällen einfach

A(boost::shared_ptr<B> val) : _val(new B(*val)) { } 

tun zu schreiben.

+0

Warte warten. Wenn das Objekt einen rohen Zeiger hat - sei vorsichtig. –

+1

+1. Ich sehe keinen Grund, Ihre Antwort zu verwerfen. Andererseits. –

+0

Mykola: Was roher Zeiger? Das ist hier nicht möglich. Diese Antwort ist völlig korrekt. –

2

Wenn die Bibliothek dieses B-Objekt definiert, soll die Bibliothek zur Verfügung stellen (oder gar verbieten) den Mechanismus für B. Kopieren

Als Nebenbemerkung,

Wenn Ihre Klasse A ist ausschließlich die Lebensdauer dieser Regelung kopiertes Objekt, der intelligente Zeiger, den Sie wirklich verwenden möchten, ist boost::scoped_ptr.

boost::shared_ptr ist nach seiner Fähigkeit, lebenslange Verantwortung zu teilen, die es klingt wie du willst nicht genannt. scoped_ptr wird das nicht zufällig passieren lassen.

+0

Oder nur ein Mitglied der Klasse. –