2013-07-02 19 views
8

Ho una domanda sui puntatori C++ 11. In particolare, come si trasforma un puntatore univoco per la classe base nella classe derivata?std :: unique_ptr con classe derivata

class Base 
{ 
public: 
    int foo; 
} 

class Derived : public Base 
{ 
public: 
    int bar; 
} 

... 

std::unique_ptr<Base> basePointer(new Derived); 
// now, how do I access the bar member? 

dovrebbe essere possibile, ma non riesco a capire come. Ogni volta che provo a utilizzare

basePointer.get() 

Finisco con l'arresto anomalo dell'eseguibile.

Grazie in anticipo, qualsiasi consiglio sarebbe apprezzato.

+2

Potrebbe mostrare una completa (ma minima) esempio del codice che causa il processo di crash del? 'basePointer.get()' da solo non è certamente un problema. – jogojapan

+0

@jogojapan Ho risolto il problema. Stavo facendo un casting davvero strano con almeno 5 serie di parentesi. Sono abbastanza sicuro che fosse solo una cosa stupida, ma l'ho già cambiato e non ricordo cosa ho fatto. La risposta di Captain Obvlious ha funzionato per me comunque. Grazie per tutto il vostro aiuto! –

risposta

22

Se sono tipi polimorfici e avete solo bisogno di un puntatore per l'utilizzo tipo derivato dynamic_cast:

Derived *derivedPointer = dynamic_cast<Derived*>(basePointer.get()); 

Se non sono tipi polimorfici bisogno solo di un puntatore per l'utilizzo tipo derivato static_cast e sperare per il meglio :

Derived *derivedPointer = static_cast<Derived*>(basePointer.get()); 

Se avete bisogno di convertire un unique_ptr contenente un tipo polimorfico:

Derived *tmp = dynamic_cast<Derived*>(basePointer.get()); 
std::unique_ptr<Derived> derivedPointer; 
if(tmp != nullptr) 
{ 
    basePointer.release(); 
    derivedPointer.reset(tmp); 
} 

Se avete bisogno di convertire unique_ptr contenente un tipo non polimorfico:

std::unique_ptr<Derived> 
    derivedPointer(static_cast<Derived*>(basePointer.release())); 
+0

grazie, questo ha funzionato per me! –

+0

Sei sicuro che non ci siano perdite di memoria quando esegui basePointer.release()? – Marc

+0

@Marc Sì, ne sono sicuro. –

Problemi correlati