2010-04-19 37 views
6

Tôi có một lớp có chức năng khởi tạo opengl và chạy nó trong chuỗi riêng biệt.Cách truyền hàm thành viên không tĩnh vào glutDisplayFunc

Vấn đề của tôi là: openGL callbacks như glutDisplayFunc, glutMotionFunc etc chấp nhận void (* f) void, và tôi không thể vượt qua chức năng thành viên lớp học.

các cách xung quanh. 1) Tôi có thể khai báo hàm thành viên là tĩnh, nhưng trong trường hợp này tôi cần khai báo tất cả các biến thành viên đã sử dụng là tĩnh và kết thúc khai báo toàn bộ một lớp là tĩnh.

2) Tôi có thể sử dụng một số chức năng độc lập và khai báo đối tượng của mình là toàn cầu, nhưng nó quá tệ.

Tôi tự hỏi nếu có một số cách xung quanh vì vậy tôi không cần phải làm cho lớp opengl tĩnh của tôi ?? (Sử dụng C++)

Trả lời

0

Một cách giải quyết đơn giản là:

Khai báo một con trỏ toàn cầu để lớp học của bạn và khởi tạo nó trong hàm main (), chúng ta hãy gọi lại gọi một phương thức thường xuyên về trường hợp đó

MyOGLClass *g_pOGL; 

void oglDraw() 
{ 
    if(g_pOGL) 
     g_pOGL->oglDraw(); 
} 

void main() 
{ 
    // Init your class 
    MyOGLClass o; 

    g_pOGL = &o; 

    //... 

    glutMainLoop(); 

} 

hạn chế là bạn có thể chỉ có một thể hiện của lớp học của bạn, nhưng đối với một ứng dụng OpenGL đó không phải là quá tệ như bạn thực sự chỉ cần một trong anyway ...

2

Vì các cuộc gọi lại không thực hiện bất kỳ tham số nào, bạn không thể làm được gì nhiều. Một khả năng là tạo ra một không gian tên với các hàm và một thành phần dữ liệu tĩnh là lớp hiện tại của bạn. Các hàm sẽ chỉ chuyển tiếp các lời gọi hàm đến lớp hiện có. Đây chỉ là một phiên bản sạch hơn về số 2 của bạn.

namespace GLForwader 
{ 
    static MyGLClass* = new myGlClass(); 

    void glutDisplayFunc() {myGlClass->glutDisplayFunc();} 
    void glutMotionFunc() {myGlClass->glutMotionFunc();} 
} 
0

Tôi vừa tìm kiếm điều này vì tôi gặp vấn đề tương tự khi dọn dẹp và OOP'ing mã của chúng tôi. Hóa ra những thứ tốt đẹp như std :: bind không hoạt động ở đây, nhưng nếu bạn đang biên dịch trên C++ 11, bạn có thể định nghĩa một hàm ẩn danh để bọc hàm thành viên của bạn.

class Renderer { 
    void Start(); 
    void Render(); 
} 

// ... 

void Renderer::Start() { 
    // ... 
    glutDisplayFunc([](){ Render(); }); 
} 
+0

Đoạn mã này tạo ra một lỗi: ‘this’ không được chụp cho hàm lambda' này, làm cách nào để khắc phục sự cố này? – wil93

+0

'lỗi: sử dụng không hợp lệ chức năng thành viên không tĩnh glutDisplayFunc ([]() {draw;});' –

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