Pull to refresh

Comments 2

Спасибо за статью! Было интересно попробовать ручками это проделать. Садо-мазо, конечно, но для составления собственной картины полезно.

Кстати, один нюанс заинтересовал. Обычно я трепетно отношусь к предупреждениям компилятора, поэтому собираю с -Wall. Попробовал и тут, получив предупреждения incompatible types. Потому что в функции animal_tiger_class_init указатель на функцию parent_class->say_meow принимает функцию с другим аргументом. И потому что в тестовом main «animal_cat_say_meow(tiger)» тоже принимает указатель на cat, а мы передаём tiger. Это не ошибка в данном случае, но warnings раздражают. Есть ли способ в реальной ситуации писать такие моменты более корректно, чтобы не приходилось на весь проект -Wno-incompatible-pointer-types выставлять? (в animal_tiger_class_init я могу явное преобразование типа писать, но в «пользовательском коде», где «виртуальная» функция animal_cat_say_meow вызывается, как быть? В каждом месте преобразование (AnimalCat*)ptr писать?)
Да, совершенно справедливое замечание, у меня данный код тоже собирается с кучей ворнингов. Пока я писал упрощённый, минимально рабочий вариант кода, хотя на практике в GObject автоматически генерируется куча полезных макросов приведения типов, проверки на принадлежность к конкретному типу или к определённой иерархии типов и много других полезных возможностей. Если дойдут руки до следующей статьи, подробно всё это распишу и составлю систематизирующую таблицу.
Sign up to leave a comment.

Articles