Я хотел бы знать, если есть способ вызвать p1->perimeter()
, вместо вызова выше и внутри perimeter()
функция будет автоматически (знаю, что я ссылаюсь на p1
), сказал, что этовычислил бы периметр самого p1
.
C не обеспечивает какого-либо удовлетворительного способа передать объект для perimeter()
для работы, кроме как через аргумент функции.Существует множество механизмов, с помощью которых вы могли бы хранить указатель на struct polygon
где-то, что функция знает, чтобы искать его, но все они грязные и / или не поточнобезопасные, и все они требуют какой-то операцииили дополнительный код в дополнение к выбору функции и вызову функции.
Оператор ->
просто не передает никакой информации о своем (левом) операнде в свой результат, и даже если он это сделал, выражения вызова функции Cпередавать информацию в вызываемую функцию только через аргументы функции.
@ Ответ Джона Кугельмана уже представляет идиоматический подход на языке Си к этой проблеме: передать объект для обработки в качестве аргумента.Обычно это делает вместо , выбирая функцию через член объекта-операнда, и таким образом избегает избыточности, на которую вы указали в вопросе.
Идя в противоположном направлении, затемЕсть несколько забавных игр, в которые вы можете играть в C11 и позже, используя generic selection , чтобы выбрать функцию для вызова в зависимости от типа аргумента.Обычно это оборачивается в общий макрос.Возможно, это уменьшит для вас важность записи функций в качестве членов объектов, над которыми они должны работать.Например:
#define perimeter(x) _Generic((x), \
struct circle *: circle_perimeter, \
struct polygon *: poly_perimeter, \
struct path *: path_perimeter)(x)
Затем, когда вы вызываете perimeter(a_shape_pointer)
, вы вызываете функцию, соответствующую типу аргумента.