当前位置: 技术问答>linux和unix
使用c++编写gtk程序
来源: 互联网 发布时间:2015-05-31
本文导语: 学习gtk编程,后来想把它和c++的程序同时使用 解决方案: 1.使用绑定c++的gtk---gtkmm 2.只使用c++里的c 3.把所用的回调函数定义为c++类中的静态成员函数,然后用c接口来调用GTK 前面两个还可以理解,第三点还真不知道具体操...
学习gtk编程,后来想把它和c++的程序同时使用
解决方案:
1.使用绑定c++的gtk---gtkmm
2.只使用c++里的c
3.把所用的回调函数定义为c++类中的静态成员函数,然后用c接口来调用GTK
前面两个还可以理解,第三点还真不知道具体操作
解决方案:
1.使用绑定c++的gtk---gtkmm
2.只使用c++里的c
3.把所用的回调函数定义为c++类中的静态成员函数,然后用c接口来调用GTK
前面两个还可以理解,第三点还真不知道具体操作
|
因为C++的对象模型决定了类成员函数是单独存放的,而不是和类的数据成员在一起,因此必须有一种手段将类的实例告诉成员函数,因此成员函数拥有一个隐含的this指针作为所有成员函数的参数,这是由编译器悄悄完成的,一个极端的例子是你可以在成员函数中直接使用this来表示指向对象本身的指针。这样的结果是成员函数的参数列表和回调函数的要求不一致,从而导致非静态成员函数不能作为C的回调函数。
但是,静态成员函数却不相同,他们没有这个隐含的this指针参数,因此在静态成员函数中不能访问非静态数据成员,但是另一方面,他们的参数列表却能满足回调函数的需要,可以作为非成员函数的替代品。
遗留的问题是,静态成员函数作为回调函数,无法访问数据成员,常见的手法是使用回调函数常见的void* data参数用来传递对象的指针。
但是,静态成员函数却不相同,他们没有这个隐含的this指针参数,因此在静态成员函数中不能访问非静态数据成员,但是另一方面,他们的参数列表却能满足回调函数的需要,可以作为非成员函数的替代品。
遗留的问题是,静态成员函数作为回调函数,无法访问数据成员,常见的手法是使用回调函数常见的void* data参数用来传递对象的指针。
|
不会定义静态成员函数?
|
class MyControl
{
private:
GtkButton* _btn;
public:
static void foo(){}
MyControl()
{
//...
g_signal_connect(G_OBJECT(_btn),"clicked",foo,NULL);
}
}
{
private:
GtkButton* _btn;
public:
static void foo(){}
MyControl()
{
//...
g_signal_connect(G_OBJECT(_btn),"clicked",foo,NULL);
}
}