我正在尝试使用GLIBMM在C++中重新实现一组GLIB类。它们中的大多数都是错误的,需要进行大量扩展,而且由于整个项目都是用C++完成的,所以我倾向于在修改代码之前对代码进行移植。
不幸的是,我不是一个口若悬河的专家,即使我花了很多天在官方文档上,我仍然在理解一些概念上有困难,尤其是在Properties方面。
据我所知,属性是setter和getter的完全替代(甚至更多)。基本上,不对每个属性使用专门的方法,而是对所有属性使用公共set/get_property方法,使用名称(或ID)访问属性,并使用像GValue这样的容器来保存多种类型的数据。
我能看到的唯一优点是能够使用字符串中包含的名称访问属性(例如,来自配置文件),但我肯定缺少了一些东西。此外,这在GLIB中似乎是正确的,但在Glib::ObjectBase中则不是这样,它说您应该更喜欢专门的property_(*) getter/setter,而不是property_set/get_value。
阅读有关Glib::Property的文档--我不确定C++中的完整属性实现会有什么样的效果,我认为,缺乏使用GLIB的经验使它变得更加困难。
我希望使用set/set方法将每个属性作为属性进行移动,但我不想做太多的更改,发现以前的方法要好得多:)
有人能解释一下属性是什么(如果与C++类属性比较的话)吗?你能给我一个有信号/插槽的工作属性的例子吗?有人能说明一下这两种方法的优点吗?
谢谢!
发布于 2016-05-25 14:43:32
如果我们在Glib属性的掩护下查看GObject性质,我们就会看到c实现在起作用。上面的链接还详细解释了代码。
对象属性 “GObject的一个好特性是它的对象属性的通用get/set机制,当一个对象被实例化时,应该使用对象的class_init处理程序来向g_object_class_install_properties注册对象的属性。
在C++和C中有更详细的解释,可以在这两个链接中找到。
了解对象属性如何工作的最佳方法是查看如何使用对象属性的实际示例:
如果我们看看Glib属性细节,我们可以看到
一个Glib::Object属性. “这个类封装了一个GObject属性,为GObject属性系统提供了一个C++ API,用于派生自Glib::或Glib::接口的类。 属性值是与类型的每个实例和每个属性的某些类数据相关联的值:
示例参考文献GObject性质
class MyCellRenderer : public Gtk::CellRenderer
{
public:
MyCellRenderer()
:
Glib::ObjectBase (typeid(MyCellRenderer)),
Gtk::CellRenderer(),C或C++ (构造器/析构函数)模板Glib::Property< T>:属性( Glib::Object& object,const::ustring& name )中类型定义的等效值
mybool是名称,true是默认值
property_mybool (*这个,"mybool",真的), property_myint_ (*这个,"myint",42)
{}
virtual ~MyCellRenderer() {}// Glib::Property<>可以公开,
**类型声明构造函数/析构函数(如公共或私有)**
Glib::Property<bool> property_mybool;
// or private, and combined with Glib::PropertyProxy<>.
Glib::PropertyProxy<int> property_myint() { return property_myint_.get_proxy(); }
private:
Glib::Property<int> property_myint_;
};g_object_set_property和class_init处理程序都可能对Ref GObject性质有用。
万事如意
https://stackoverflow.com/questions/37278099
复制相似问题