gpt4 book ai didi

c - 使用不是 GObject 属性的参数初始化 GObject?

转载 作者:行者123 更新时间:2023-12-02 02:21:46 25 4
gpt4 key购买 nike

我有一个 GObject“A”,它在其构造函数中创建另一个 GObject“B”的实例。

“B”对象需要传递几个仅用于构造的属性。现在,在创建对象“A”的实例时,我希望允许通过对象“A”的构造函数将这些属性的值传递到对象“B”的构造函数。

我发现这样做的唯一方法是为对象“A”创建相同的属性并将它们的值传递给“B”的构造函数。这些属性对“A”没有进一步的意义,所以这看起来像是一个拼凑。

有没有更好的方法来做我想做的事?

最佳答案

  • A 继承自 B。然后 A 自动拥有 B 的所有属性。
  • 不要在 A 中使用属性,而是传递 B 的属性(或者更好的是,一个已经构建的 B 对象) 作为 A 的构造函数的参数。
  • 延迟 B 的构造,直到 A 可以弄清楚它需要如何配置 B。向 Ab_initialized 或其他内容添加私有(private)标志,告诉您 A 的内部指针是否指向 B有效。

关于第二个建议的更多说明:

A 的内容是在G_DEFINE_TYPE() 宏提供的a_init() 函数中构造的。但这不是您获取 A 实例的方式。通常编写一个函数,它是 A 的公共(public)接口(interface)的一部分,如下所示:

A *a_new() 
{
return (A *)g_object_new(TYPE_A, NULL);
}

您可以轻松地扩展它以包含其他参数:

A *a_new(int b_param_1, int b_param_2)
{
A *a = (A *)g_object_new(TYPE_A, NULL);
a->priv->b = b_new(b_param_1, b_param_2);
return a;
}

如果您使用 g_object_new 构建A 对象,其缺点是它处于无效状态(即没有B) ,例如,如果您尝试从 GtkBuilder 文件构建它。如果这是一个问题,我仍然强烈建议重构。

关于c - 使用不是 GObject 属性的参数初始化 GObject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7777869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com