2012-04-29 3 views
7

Я закодировал следующее, и я очень новичок в C++, и он чувствует себя неуклюжим. Я пытаюсь предоставить класс spriteBatch (unique_Ptr). Вот заголовок файла:Что такое синтаксис объявления переменной unique_Ptr в заголовке, а затем назначить его позже в конструкторе?

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


private: 

    std::unique_ptr<SpriteBatch> spriteBatch; 

}; 

Затем в CPP файле Конструктора, это:

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

Это только кажется неуклюжим, как я должен был создать «ШБ» и переместить его в «SpriteBatch». попытка прямого назначения «spriteBatch» не удалась (может быть, я просто не знаю правильного синтаксиса). Есть ли способ избежать необходимости использовать 'sb' & std :: move?

спасибо.

+0

Если это в конструкторе, вы можете просто использовать инициализатор элемента. – chris

+0

А, спасибо, но на самом деле мой код выше не компилируется, поэтому мой вопрос был несколько преждевременным. Вернуться к квадрату 1. –

ответ

8

должно работать нормально:

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

В качестве альтернативы, вы можете избежать повторения имени типа с некоторыми make_unique function.

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

Там также reset member:

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

Но, так как вы упоминаете конструктор, то почему бы не просто использовать список инициализации членов?

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

Спасибо, но я должен что-то делать неправильно (возможно, в заголовке). Большинство методов, которые вы перечисляете, вызывают следующие жалобы компилятора: cuberenderer.h (48): ошибка C2065: «SpriteBatch»: необъявленный идентификатор cuberenderer.h (48): ошибка C2065: «SpriteBatch»: необъявленный идентификатор cuberenderer.cpp (14): ошибка C2663: 'std :: unique_ptr <_Ty,_Dx> :: unique_ptr': 7 перегрузок не имеют юридического преобразования для указателя 'this' –

+0

Мне не хватало директивы 'using'. Это давало мне все ошибки компиляции. Как только я прошел мимо, все ваши методы работали. Спасибо!! –

+0

Имеет ли make_unique или список инициализаторов какие-либо отличия? Меня интересует производительность. – JohnJohn