- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以 glib GObject 为例:
typedef struct _MyInstance MyInstance;
struct _MyInstance {
GObject parent;
......//instance variable
......//this place is method function pointer in instance structure.
};
typedef struct _MyInstanceClass MyInstanceClass;
struct _MyInstanceClass {
GObjectClass parent_class;
......//class variable
......//this place is method function pointer in class structure.
};
我不明白方法函数指针放入它所看到的相同的类或实例结构中。它们有什么区别?我认为每个实例对象的类函数方法指针都用于调用相同的函数,因此将此函数放入类结构中。但是,如何使用实例对象的函数方法指针来代替它自己的方法指针呢?因为我认为实例对象的函数方法指针对于自身来说是相同的,如何理解实例对象的函数方法?下面我给出 gstreamer Gstpad.h 代码片段作为示例:
struct _GstPad {
GstObject object;
/*< public >*/
gpointer element_private;
GstPadTemplate *padtemplate;
GstPadDirection direction;
/*< public >*/ /* with STREAM_LOCK */
/* streaming rec_lock */
GStaticRecMutex *stream_rec_lock;
GstTask *task;
/*< public >*/ /* with PREROLL_LOCK */
GMutex *preroll_lock;
GCond *preroll_cond;
/*< public >*/ /* with LOCK */
/* block cond, mutex is from the object */
GCond *block_cond;
GstPadBlockCallback block_callback;
gpointer block_data;
/* the pad capabilities */
GstCaps *caps;
GstPadGetCapsFunction getcapsfunc;
GstPadSetCapsFunction setcapsfunc;
GstPadAcceptCapsFunction acceptcapsfunc;
GstPadFixateCapsFunction fixatecapsfunc;
GstPadActivateFunction activatefunc;
GstPadActivateModeFunction activatepushfunc;
GstPadActivateModeFunction activatepullfunc;
/* pad link */
GstPadLinkFunction linkfunc;
GstPadUnlinkFunction unlinkfunc;
GstPad *peer;
gpointer sched_private;
/* data transport functions */
GstPadChainFunction chainfunc;
GstPadCheckGetRangeFunction checkgetrangefunc;
GstPadGetRangeFunction getrangefunc;
GstPadEventFunction eventfunc;
GstActivateMode mode;
/* generic query method */
GstPadQueryTypeFunction querytypefunc;
GstPadQueryFunction queryfunc;
/* internal links */
#ifndef GST_DISABLE_DEPRECATED
GstPadIntLinkFunction intlinkfunc;
#else
#ifndef __GTK_DOC_IGNORE__
gpointer intlinkfunc;
#endif
#endif
GstPadBufferAllocFunction bufferallocfunc;
/* whether to emit signals for have-data. counts number
* of handlers attached. */
gint do_buffer_signals;
gint do_event_signals;
/* ABI added */
/* iterate internal links */
GstPadIterIntLinkFunction iterintlinkfunc;
/* free block_data */
GDestroyNotify block_destroy_data;
/*< private >*/
union {
struct {
gboolean block_callback_called;
GstPadPrivate *priv;
} ABI;
gpointer _gst_reserved[GST_PADDING - 2];
} abidata;
};
struct _GstPadClass {
GstObjectClass parent_class;
/* signal callbacks */
void (*linked) (GstPad *pad, GstPad *peer);
void (*unlinked) (GstPad *pad, GstPad *peer);
void (*request_link) (GstPad *pad);
gboolean (*have_data) (GstPad *pad, GstMiniObject *data);
/*< private >*/
gpointer _gst_reserved[GST_PADDING];
};
从上面的代码片段中可以看到实例结构和类结构中的函数方法指针。实例函数方法指针由gst_pad_init函数初始化,如下:
static void
gst_pad_init (GstPad * pad)
{
........//other no important code
GST_PAD_CHAINFUNC (pad) = NULL;
GST_PAD_LINKFUNC (pad) = NULL;
GST_PAD_CAPS (pad) = NULL;
GST_PAD_GETCAPSFUNC (pad) = NULL;
GST_PAD_ACTIVATEFUNC (pad) = gst_pad_activate_default;
GST_PAD_EVENTFUNC (pad) = gst_pad_event_default;
GST_PAD_QUERYTYPEFUNC (pad) = gst_pad_get_query_types_default;
GST_PAD_QUERYFUNC (pad) = gst_pad_query_default;
#ifndef GST_REMOVE_DEPRECATED
GST_PAD_INTLINKFUNC (pad) = gst_pad_get_internal_links_default;
#endif
GST_PAD_ITERINTLINKFUNC (pad) = gst_pad_iterate_internal_links_default;
GST_PAD_ACCEPTCAPSFUNC (pad) = gst_pad_acceptcaps_default;
............//other no important code
}
所以我很困惑这个问题,为什么实例结构中有函数方法指针而不是放入类类结构中?
最佳答案
方法函数指针属于类结构。对于任何虚拟方法(可以在继承类中重写的方法)都是如此。
在实例结构中声明函数指针意味着相应的方法仅在该特定类的对象上定义,并且不能被覆盖(非虚拟)。
但是,在这种情况下,根本不需要公开函数指针,因为永远不会有该方法的多个实现,因此对于调用哪个实现永远不会有任何歧义。遵循 GObject 约定,您只需在头文件中声明一个与该方法相对应的函数,然后在源文件中提供一个实现。
GObject 引用手册 illustrates these scenarios ,与 the "Non-virtual public methods" section显示通常执行的操作,而不是在实例结构中声明函数指针。
<小时/>您粘贴的 GStreamer 代码显示了上述情况的一个异常(exception)。在该代码中,存储在实例结构中的函数指针实际上是 GstPad 对象的属性,而不是在对象本身上定义的方法。 The description of the class州
A GstElement creating a pad will typically use the various gst_pad_set_*_function() calls to register callbacks for events, queries or dataflow on the pads.
因此,activatefunc
成员存储一个指向回调函数的指针,该函数在激活 pad 时调用,例如,对于其余函数指针也类似。这是有道理的,因为回调函数更多的是对象拥有的东西,而不是对象本身本质的一部分。
也就是说,确实更纯粹的面向对象实现可能
我的猜测是 GStreamer 设计者选择了他们所做的更简单的实现
关于c - 如何确定方法函数指针属于 GObject 的实例结构还是类结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34430659/
我有一个 GObject“A”,它在其构造函数中创建另一个 GObject“B”的实例。 “B”对象需要传递几个仅用于构造的属性。现在,在创建对象“A”的实例时,我希望允许通过对象“A”的构造函数将这
我正在尝试用 c (c_glib) 创建一个 Flume-thrift 客户端,但在创建应发送到服务器的 gobject 时遇到问题。我在 main.c 中的行中收到以下错误: `GLib-GObje
我在 gobject 上阅读了一个维基百科页面,上面写着, Depending only on GLib and libc, GObject is a cornerstone of GNOME and
我尝试像这样导入 Gtk:从 gi.repository 导入 Gtk 我收到以下错误: ImportError:当使用 gi.repository 时,您不能导入像“gobject”这样的静态模块。
我是编程新手。我正在创建一个 Qt GUI 应用程序。这是一个小的拼字游戏。问题是每当我在构建它后从命令提示符启动这个程序时,我都会在命令提示符下得到以下输出: JumbleGame 1.0 Laun
GObject 世界中有没有办法在编译时检测未初始化的纯虚函数? 我想调用一个纯虚拟方法而不先检查它。 /* pure_virtual_method must be non NULL */ base-
我正在使用 pygtk 通过框架编写程序。主程序做以下事情: 创建一个看门狗线程来监控一些资源 创建客户端从socket接收数据 调用gobject.Mainloop() 但是好像我的程序进入Main
问题 使用 GObject 和 C,我试图在模块“Foo”中创建名为“Bar”的类 GObject 的子类。但是,宏“G_DECLARE_FINAL_TYPE”(在 gobject/gtype.h 中
如何在 GObject/Gtk 中获取某个类的类对象?例如,如果我的类是 GtkSpinButton,我想获取代表该类的 GtkSpinButtonClass 实例。就是中的参数“class” gtk
我正在寻找 GObject 备忘单,了解常见的 OOP 概念如何映射到 GObject 的设施。例如考虑: AnyGObject *o; o = anygobject_new(); 现在,约定是什么.
何时取消引用 GObject 以及何时释放它? GObject tutorial声明一个 GObject 应该被和释放,但是一个 GObject 真的不应该释放自己当且仅当它的引用计数下降到 0 吗?
我想使用 GObject.add_emission_hook 来连接以捕获类的所有实例的信号。它似乎有效,但只有一次。在下面的最小示例中,无论单击其中一个按钮多少次,“收到信号”仅打印一次。这是为什么
有没有办法用小部件存储自定义信息? 例如,假设我有一个包含 20 个网址的列表。 我创建了 20 个按钮,每个 url 一个。 我想做到这一点,以便当我单击按钮时,会打开一个网址。但我需要一种方法来知
以 glib GObject 为例: typedef struct _MyInstance MyInstance; struct _MyInstance { GObject paren
我在 python 中使用 io_add_watch 监视器时遇到问题(通过 gobject)。我想在每次通知后对整个缓冲区进行非阻塞读取。这是代码(缩短了一点): class SomeApp(obj
GObject Reference Manual声明 GObject 系统旨在通过使用一些通用胶水代码将用 C 编写的函数导出到其他语言。还需要注意的是,这种胶水明确存在于 perl 和 python
我想在 Codeblocks 中使用 C GObject 库创建类。所以我有 2 个类:A.h 和 A.c但是当我像这样包含 gobject 库时: #include 它给我一个错误: Only
我想使用 GObject 调用的那个函数看起来像下面这样: char * some_object_fun(SomeObject *self, char *input); 有什么好的方法可以实现吗?我会
我正在开发一个 gstreamer 应用程序。有一些基本概念我不明白。谁能解释一下 g Object 的概念?还有什么是gobject initialization, gobject properti
我想在开始耗时的操作(将几兆字节的文本加载到 TextBuffer 中)之前修改 PyGTK 应用程序中某些标签的文本。但是,当我尝试执行此操作时,标签更新直到 TextBuffer 开始加载文件(文
我是一名优秀的程序员,十分优秀!