суббота, 10 ноября 2012 г.

Методы объекта в C

Когда плюсистов насильно пересаживают на Си, одним из пунктов ломки по нормальным языкам является отсутствие адекватных объектов и их методов. Но если становится совсем плохо, методы можно легко реализовать.

Пусть дана структура, точка, например. Она состоит из 2 координат:

typedef {
    float x;
    float y;
} Point;


Функция изменения координат будет выглядеть так:

void movePointBy(Point * p, int x, int y) {
    p->x += x;
    p->y += y;
}


Но можно применить C++ ситль и тогда у объектов внезапно появятся методы:

typedef struct _Point {
    void (*moveBy) (struct _Point * self, int x, int y);
    float x;
    float y;
} Point;

void movePointBy(Point * p, int x, int y) {
    p->x += x;
    p->y += y;
}

int main() {
    Point p;
    p.moveBy = movePointBy;

    movePointBy(&p, 1, 2);
    p.moveBy(&p, 1, 2);

    return 0;
}


Как видим, теперь одну и ту же функцию можно вызывать просто так, а можно как метод объекта. Вообще, второе на мой взгляд довольно сомнительная практика.

Из плюсов у неё только то, что можно меньше заботиться о пространстве имён (часто для решения этой проблемы в Си используется префикс типа point_MoveBy).

Из минусов - лишний геморрой с указателями на функции, увеличивается размер объектов, на вызов метода из одного объекта можно подать другой объект, что приведёт к путанице.

В общем это приём, который добавляет проблем, не внося никаких плюсов.

UPD: самый существенный минус - осложнения с оптимизацией. Об этом здесь.