Tôi có 2 lớp quản lý tài nguyên DeviceContext
và OpenGLContext
cả hai đều là thành viên của class DisplayOpenGL
. Thời gian hoạt động của tài nguyên được gắn với DisplayOpenGL
. Khởi trông như thế này (pseudo code):C++ - Chạy một hàm trước khi khởi tạo thành viên lớp
DeviceContext m_device = DeviceContext(hwnd);
m_device.SetPixelFormat();
OpenGLContext m_opengl = OpenGLContext(m_device);
Vấn đề là các cuộc gọi đến SetPixelFormat(), vì tôi không thể làm điều đó trong danh sách khởi tạo của DisplayOpenGL
c'tor:
class DisplayOpenGL {
public:
DisplayOpenGL(HWND hwnd)
: m_device(hwnd),
// <- Must call m_device.SetPixelFormat here ->
m_opengl(m_device) { };
private:
DeviceContext m_device;
OpenGLContext m_opengl;
};
Giải pháp mà tôi có thể thấy:
- Chèn
m_dummy(m_device.SetPixelFormat())
- Sẽ không làm việc như SetPixelFormat() không có retval. (bạn nên làm điều này nếu nó có một khoản hoàn trả?) - Sử dụng
unique_ptr<OpenGLContext> m_opengl;
thay vìOpenGLContext m_opengl;
.
Sau đó khởi tạo nhưm_opengl()
, gọi SetPixelFormat() trong cơ thể c'tor và sử dụngm_opengl.reset(new OpenGLContext);
- Gọi
SetPixelFormat()
từDeviceContext
c'tor
nào trong các giải pháp này là một lợi thế và tại sao? Bất cứ điều gì tôi đang mất tích?
Tôi đang sử dụng Visual Studio 2010 Express trên Windows, nếu nó quan trọng.
Chỉnh sửa: Tôi chủ yếu quan tâm đến việc cân bằng liên quan đến việc quyết định một trong các phương pháp này.
m_dummy()
không hoạt động và dường như không thanh nha ngay cả khi nó sẽunique_ptr<X>
là thú vị với tôi - khi ta muốn sử dụng nó thay vì một "bình thường"X m_x
thành viên? Hai phương pháp dường như có chức năng tương đương nhiều hoặc ít hơn, ngoại trừ các vấn đề khởi tạo.- Gọi
SetPixelFormat()
từDeviceContext
c'tor chắc chắn hoạt động nhưng cảm thấy ô uế với tôi.DeviceContext
nên quản lý tài nguyên và cho phép sử dụng tài nguyên, không áp đặt chính sách định dạng pixel ngẫu nhiên cho người dùng. - stijn's
InitDev()
trông giống như giải pháp sạch nhất.
Tôi có luôn muốn một giải pháp dựa trên con trỏ thông minh trong các trường hợp như vậy không?
Điều này có vẻ giống như các loại trường hợp một chức năng nhà máy tĩnh có thể hữu ích hơn một constructor. – cdhowie
dường như với tôi như giải pháp thứ ba của bạn sẽ hoạt động. Có lý do nào bạn chọn không? Ngoài ra, tại sao không sử dụng một thư viện như GLFW để tải ngữ cảnh OpenGL của bạn? –
Tôi không biết GLFW khi tôi bắt đầu. Sẽ có một cái nhìn, cảm ơn. –