Я пытаюсь переопределить набор классов GLIB в C ++, используя GLIBMM.
Большинство из них содержат ошибки и требуют значительного расширения, и, поскольку весь проект выполнен на C ++, я предпочел перенести код перед его исправлением.
К сожалению, я не эксперт GLIB, и даже если я потратил много дней на официальную документацию, у меня все еще есть проблемы с пониманием некоторых концепций, особенно в отношении Properties.
Насколько я понял, свойства — это полная замена (а может и больше) для сеттеров и геттеров. По сути, вместо использования специализированных методов для каждого атрибута, для всех них используется общий метод set / get_property, который обращается к свойству с именем (или идентификатором) и использует контейнер, такой как GValue, для хранения данных различного типа.
Единственное преимущество, которое я вижу в этом, — это возможность доступа к свойствам с именами, содержащимися в строках (которые могут быть получены, например, из файла конфигурации), но я наверняка что-то упускаю. Более того, это похоже на правду в GLIB, но не в Glib :: ObjectBase, которая говорит, что вы должны предпочесть специальное свойство _ (*) getter / setter вместо property_set / get_value.
Читая документацию по Glib :: Property, я не уверен, что должна нравиться полная реализация свойств в C ++, я предполагаю, что отсутствие опыта в GLIB усложняет ситуацию.
Я хотел бы переместить каждое свойство как атрибут с помощью стандартных методов get / set, но я не хочу вносить много изменений, обнаруживая слишком поздно, что предыдущий подход был в разы лучше 🙂
Может кто-нибудь объяснить мне, что такое свойство (если сравнивать с атрибутом класса C ++)? Можете ли вы дать мне пример рабочего свойства с сигналом / слотами? Может ли кто-то осветить преимущества двух способов?
Спасибо!
Если мы посмотрим под капотом Glib Properties GObject свойства
мы видим реализацию c на работе. Приведенная выше ссылка также содержит подробное объяснение кода.
Свойства объекта
«Одной из приятных особенностей GObject является его общий механизм получения / установки свойств объекта. Когда создается экземпляр объекта, для регистрации свойств объекта с помощью g_object_class_install_properties следует использовать обработчик class_init объекта.
Более подробное объяснение в C ++ и C можно найти в обеих ссылках.
Лучший способ понять, как работают свойства объекта — взглянуть на реальный пример его использования:
Если мы посмотрим на Glib Недвижимость Подробнее мы можем увидеть
Glib :: Свойство объекта.
«Это класс оборачивает свойство GObject, предоставление C ++ API в систему свойств GObject, для использования с классами, производными от Glib :: Object или Glib :: Interface.
Свойство — это значение, связанное с каждым экземпляром типа и некоторыми данными класса для каждого свойства:
- Его уникальное имя, используемое для идентификации имущества.
- Человеческое прозвище.
- Краткое описание
- Значение по умолчанию и минимальные и максимальные границы (в зависимости от типа свойства).
- Флаги, определяющие, среди прочего, может ли свойство быть прочитано или записано. «
Пример Ref GObject свойства
class MyCellRenderer : public Gtk::CellRenderer
{
public:
MyCellRenderer()
:
Glib::ObjectBase (typeid(MyCellRenderer)),
Gtk::CellRenderer(),
Эквивалент определения типа в C или C ++ (Конструктор / Деструктор)
Шаблон Glib :: Свойство< T> :: Недвижимость (Glib :: Object& объект,
const Glib :: ustring& название
)
mybool это имя а также значение по умолчанию
property_mybool (* это, «mybool», правда),
property_myint_ (* this, «myint», 42)
{}
virtual ~MyCellRenderer() {}
// Glib :: Свойство<> может быть публичным,
** Объявление типа конструктор / деструктор Например, открытый или закрытый **
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 свойства
Всего наилучшего
Других решений пока нет …