2012-04-29 12 views
7

Ho codificato quanto segue e sono molto nuovo in C++, e mi sembra goffo. Sto provando a fornire l'ambito di classe 'spriteBatch' (a unique_Ptr). Ecco il file di intestazione:Qual è la sintassi per dichiarare una variabile unique_Ptr in un'intestazione, quindi assegnarla successivamente nel costruttore?

ref class CubeRenderer : public Direct3DBase 
{ 
public: 
    CubeRenderer(); 
    ~CubeRenderer(); 


private: 

    std::unique_ptr<SpriteBatch> spriteBatch; 

}; 

Poi nel file cpp Costruttore, questa:

std::unique_ptr<SpriteBatch> sb(new SpriteBatch(m_d3dContext.Get())); 
spriteBatch = std::move(sb); 

Sembra proprio goffo il modo in cui ho dovuto creare 'sb' e spostarla 'SpriteBatch'. tentare di assegnare direttamente a 'spriteBatch' fallito (forse semplicemente non conosco la sintassi corretta). C'è un modo per evitare di dover usare 'sb' & std :: move?

Grazie.

+0

Se questo è nel costruttore, è sufficiente utilizzare un inizializzatore membro. – chris

+0

Ah, grazie, ma in realtà il mio codice sopra non viene compilato, quindi la mia domanda è stata un po 'prematura. Torna al quadrato 1. –

risposta

8

che segue dovrebbe funzionare bene:

spriteBatch = std::unique_ptr<SpriteBatch>(new SpriteBatch(m_d3dContext.Get())); 

In alternativa, si può evitare di ripetere il nome del tipo con un certo make_unique function.

spriteBatch = make_unique<SpriteBatch>(m_d3dContext.Get()); 

C'è anche il reset member:

spriteBatch.reset(new SpriteBatch(m_d3dContext.Get())); 

Ma, dal momento che si parla di un costruttore, perché non basta utilizzare l'elenco di inizializzazione di membri?

CubeRenderer::CubeRenderer() 
: spriteBatch(new SpriteBatch(m_d3dContext.Get())) {} 
+0

Grazie, ma devo aver fatto qualcosa in modo errato (probabilmente nell'intestazione). La maggior parte dei metodi elencati produce i seguenti reclami del compilatore: cuberenderer.h (48): errore C2065: 'SpriteBatch': identificatore non dichiarato cuberenderer.h (48): errore C2065: 'SpriteBatch': identificatore non dichiarato cuberenderer.cpp (14): errore C2663: 'std :: unique_ptr <_Ty,_Dx> :: unique_ptr': 7 overload non hanno alcuna conversione legale per il puntatore 'this' –

+0

Mi mancava una direttiva 'using'. Mi stava dando tutti gli errori di compilazione. Una volta superato questo, tutti i tuoi metodi hanno funzionato. Grazie!! –

+0

make_unique o l'elenco di inizializzazione presentano differenze? Sono interessato alle prestazioni. – JohnJohn

Problemi correlati