2012-04-29 14 views
7

Mam kodowane następujące i jestem bardzo nowy w C++, a to wydaje się niezdarny. Próbuję dać zakres klasy "spriteBatch" (a unique_Ptr). Oto nagłówek pliku:Jaka jest składnia, aby zadeklarować zmienną unique_Ptr w nagłówku, a następnie przypisać ją później w konstruktorze?

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


private: 

    std::unique_ptr<SpriteBatch> spriteBatch; 

}; 

Następnie w Konstruktora pliku cpp, to:

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

tylko wydaje się niezgrabny sposób musiałem stworzyć 'SB' i przenieść ją do 'spriteBatch'. próba przypisania bezpośrednio do "spriteBatch" nie powiodła się (może po prostu nie znam właściwej składni). Czy istnieje sposób na uniknięcie konieczności używania 'sb' & std :: move?

Dziękuję.

+0

Jeśli znajduje się w konstruktorze, można po prostu użyć inicjatora członka. – chris

+0

Ah, dziękuję, ale tak naprawdę mój powyższy kod się nie kompiluje, więc moje pytanie było trochę przedwczesne. Powrót do kwadratu 1. –

Odpowiedz

8

Poniższa powinny działać prawidłowo:

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

Alternatywnie, można uniknąć powtarzania nazwy typu z pewnym make_unique function.

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

Istnieje również reset member:

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

Ale ponieważ wspomina konstruktor, dlaczego nie skorzystać z listy inicjalizacji członkiem?

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

Dzięki, ale musiałem robić coś niepoprawnie (prawdopodobnie w nagłówku). Większość wymienionych metod powoduje następujące skargi dotyczące kompilatora: cuberenderer.h (48): błąd C2065: "SpriteBatch": niezadeklarowany identyfikator cuberenderer.h (48): błąd C2065: "SpriteBatch": niezadeklarowany identyfikator cuberenderer.cpp (14): błąd C2663: "std :: unique_ptr <_Ty,_Dx> :: unique_ptr ': 7 przeciążeń nie ma legalnej konwersji dla" tego "wskaźnika –

+0

Brakowało mi dyrektywy" używanie ". To dało mi wszystkie błędy kompilacji. Kiedy to przeszłam, wszystkie twoje metody zadziałały. Dziękuję Ci!! –

+0

Czy make_unique lub lista inicjalizacyjna mają jakieś różnice? Interesuje mnie wydajność. – JohnJohn

Powiązane problemy