2009-10-28 3 views
1

GTK + (gtkmm이 아닌)를 사용하여 C++로 응용 프로그램을 작성하므로 g ++ 컴파일러를 사용하여 컴파일해야합니다. g ++ 컴파일러로 GTK + 응용 프로그램을 컴파일 할 수 있습니까? GTK + 및 라이브러리는 g ++ 컴파일러와 호환됩니까?G ++ 컴파일러로 GTK + 응용 프로그램 컴파일

#include <gtk/gtk.h> 
class LoginWindow 
{ 
    public: 
    LoginWindow(); 
    void on_window_destroy(GtkObject *object, gpointer user_data); 

    private: 

    GtkBuilder  *builder; 
    GtkWidget  *window; 
}; 

LoginWindow::LoginWindow() 
{ 
    builder = gtk_builder_new(); 
    gtk_builder_add_from_file (builder, "login_window.glade", NULL); 
    window = GTK_WIDGET (gtk_builder_get_object (builder, "login_window")); 
    gtk_builder_connect_signals (builder, NULL); 

    g_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(on_window_destroy), NULL); 
    g_object_unref (G_OBJECT (builder)); 
    gtk_widget_show (window); 
} 

void LoginWindow::on_window_destroy (GtkObject *object, gpointer user_data) 
{ 
    gtk_main_quit(); 
} 

int main (int argc, char *argv[]) 
{ 
    gtk_init (&argc, &argv); 

    LoginWindow loginWindow; 

    gtk_main(); 
    return 0; 
} 

내가 바로 그 일을하고 있는가 :

나는 다음과 같은 GTK + 기능 클래스에 전화를 포함하는 것을 시도하고있다? 온라인에서 컴파일 오류가 발생합니다.

g_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(on_window_destroy), NULL); 

login_window.cpp: In constructor "LoginWindow::LoginWindow()": 
login_window.cpp:27: error: invalid use of member (did you forget the "&" ?) 

올바른 방법은 무엇입니까?

답변

4

Gtk +는 C 기반 라이브러리이므로 class-member-functions을 콜백으로 지정할 수 없습니다. C 스타일 함수를 콜백으로 정의하십시오. 즉, 어떤 클래스 선언 외부에서도

extern "C" 
void on_window_destroy(GtkObject *object, gpointer user_data) 
{ 
    // do yer stuff.. keep in mind, there's no this-pointer here, it's not 
    // associated with an object 
} 

외부에 선언을 정의하십시오. 신호를 등록 할 때, 당신은 _ 데이터로 LoginWindow 객체 자체를 추가 할 수 있습니다와 같은, 앞으로 호출 방법 및 를 입력 할 때 단순히 캐스팅 그래서

extern "C" 
void on_window_destroy(GtkObject *object, gpointer user_data) 
{ 
    static_cast<LoginWindow*>(user_data)->on_window_destroy(); 
} 

당신이 비록 스타일을 C++하고 싶은 경우, GTK +에 대한 C++ 래퍼 인 gtkmm을 살펴 보시라. 그러면 더 많은 OOP를 얻을 수있을 것이다. gtkmm의 시그널/콜백을 사용하는 것이 좀 더 지저분하지만, 타입 안전성과 결국 많은 두통을 줄여 줄 것입니다.

관련 문제