2014-06-16 18 views
7

Đối với trò chơi của tôi, tôi nên sử dụng một con trỏ thô để tạo SDL_Window, SDL_Renderer, SDL_Texture vv như họ có chức năng xóa cụ thểcon trỏ thông minh với SDL

SDL_DestroyTexture(texture); 

hay tôi nên thêm một deleter tùy chỉnh khi tôi tạo một unique_ptr hoặc shared_ptr và nếu vậy làm thế nào tôi sẽ làm điều này với các loại SDL?

+1

không câu cuối cùng có ý nghĩa gì - * thế nào tôi sẽ làm điều này với các biến SDL *? Bạn đang hỏi làm thế nào để đi về việc tạo ra một 'unique_ptr' sẽ tự động tiêu diệt một số' SDL_ * 'đối tượng? – Praetorian

+0

Xin lỗi vì tiếng anh xấu tôi nên đọc lại lần nữa. Những gì tôi có nghĩa là làm thế nào để tôi tạo một unique_ptr để xử lý một SDL_Window/Renderer/Texture vv .. bởi vì tất cả chúng đều có những cách khác nhau để xóa. Hoặc tôi nên chỉ sử dụng một con trỏ thô vì nó sẽ không tạo ra nhiều sự khác biệt như tôi biết nơi mà họ sẽ bị xóa. –

Trả lời

23

Bạn có thể tạo một hàm giả có một số quá trình triển khai operator() bị quá tải, mỗi lần gọi hàm hủy chính xác cho loại đối số tương ứng.

struct sdl_deleter 
{ 
    void operator()(SDL_Window *p) const { SDL_DestroyWindow(p); } 
    void operator()(SDL_Renderer *p) const { SDL_DestroyRenderer(p); } 
    void operator()(SDL_Texture *p) const { SDL_DestroyTexture(p); } 
}; 

đèo này là deleter đến một unique_ptr, và bạn có thể viết các chức năng wrapper nếu bạn muốn, để tạo ra các unique_ptr s

unique_ptr<SDL_Window, sdl_deleter> 
create_window(char const *title, int x, int y, int w, int h, Uint32 flags) 
{ 
    return unique_ptr<SDL_Window, sdl_deleter>(
      SDL_CreateWindow(title, x, y, w, h, flags), 
      sdl_deleter()); 
} 
+0

Thankyou rất nhiều Praetorian đó là chính xác những gì tôi đang tìm kiếm :) –

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