2012-04-29 24 views
7

Tôi đã mã hóa những điều sau đây, và rất mới với C++, và nó cảm thấy vụng về. Tôi đang cố gắng cung cấp cho phạm vi lớp 'spriteBatch' (một unique_Ptr). Dưới đây là các tập tin tiêu đề:Cú pháp khai báo biến unique_Ptr trong tiêu đề là gì, sau đó gán nó sau này trong hàm tạo?

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


private: 

    std::unique_ptr<SpriteBatch> spriteBatch; 

}; 

Sau đó, trong tập tin cpp Constructor, này:

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

Nó chỉ có vẻ vụng về cách tôi đã phải tạo ra 'sb' và di chuyển nó đến 'spriteBatch'. cố gắng gán trực tiếp cho 'spriteBatch' không thành công (có thể tôi chỉ đơn giản là không biết cú pháp thích hợp). Có cách nào để tránh cần sử dụng 'sb' & std :: move?

Cảm ơn bạn.

+0

Nếu điều này nằm trong hàm tạo, bạn chỉ có thể sử dụng trình khởi tạo thành viên. – chris

+0

Ah, cảm ơn, nhưng thực sự mã của tôi ở trên không biên dịch nên câu hỏi của tôi hơi sớm. Quay lại hình vuông 1. –

Trả lời

8

Sau đây nên hoạt động tốt:

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

Ngoài ra, bạn có thể tránh lặp lại tên loại với một số make_unique function.

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

Ngoài ra còn có các reset member:

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

Nhưng, kể từ khi bạn đề cập đến một nhà xây dựng, tại sao không chỉ sử dụng danh sách khởi tạo thành viên?

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

Cảm ơn, nhưng tôi phải làm điều gì đó không chính xác (có thể trong tiêu đề). Hầu hết các phương pháp bạn liệt kê đều tạo ra các khiếu nại trình biên dịch sau đây: cuberenderer.h (48): lỗi C2065: 'SpriteBatch': số nhận dạng không khai báo cuberenderer.h (48): lỗi C2065: 'SpriteBatch': số nhận dạng không khai báo cuberenderer.cpp (14): lỗi C2663: 'std :: unique_ptr <_Ty,_Dx> :: unique_ptr': 7 quá tải không có chuyển đổi hợp pháp cho con trỏ 'this' –

+0

Tôi thiếu một chỉ thị 'sử dụng'. Điều đó đã cho tôi tất cả các lỗi biên dịch. Một khi tôi đã qua đó, tất cả các phương pháp của bạn đã làm việc. Cảm ơn bạn!! –

+0

Danh sách make_unique hoặc trình khởi tạo có bất kỳ sự khác biệt nào không? Tôi quan tâm đến hiệu suất. – JohnJohn

Các vấn đề liên quan