ошибка сегментации, когда я вызываю функцию-член, используя указатель на член - PullRequest
2 голосов
/ 15 декабря 2011

Я отслеживаю три цветовых точки - красный, зеленый и синий.У меня есть класс currentFrames, который содержит пару кадров - кадр из камеры и некоторые вспомогательные - и некоторые методы для манипулирования / извлечения некоторой информации из кадров.Допустим, я могу определить центр тяжести каждой точки, а затем я хочу вызвать определенную функцию в зависимости от положения этого центра тяжести.Весь кадр разделен на сетку, и каждому сегменту сетки будет назначена функция - эта функция будет вызываться при обнаружении точки в этом конкретном сегменте.

Моя идея заключается в создании многомерного массива указателейфункциям-членам:

#define CALL_MEMBER_FN(object,ptrToMember)  ((object).*(ptrToMember))
MyFuncPointerType functions[NUMBER_OF_POINTS][NUMBER_OF_SEGMENTS];

и затем назначить адреса функций следующим образом:

functions[0][0] = &currentFrames::something;

Когда, например, первая точка будет расположена во втором сегменте сетки, тогдаЯ назову правильную функцию (и она будет вызвана из класса currentFrames - вот почему я передаю *this как объект CALL_MEMBER_FN:

CALL_MEMBER_FN(*this, functions[0][1])();

Я начал с не очень сложного примера -Я хочу вызывать разные функции для каждой точки, но одинаковые для каждого сегмента («в области действия точки»):

class currentFrames
{
    public:
    void someMethod();

    private:
    void calculateVelocity();
    void redPointDetected();
    void redPointGone();

    typedef void (currentFrames::*MyFuncPointerType)();
    MyFuncPointerType functions[];
}

Затем в конструкторе currentFrames я делаю следующее:

currentFrames::currentFrames()
{
    this->functions[0] = &currentFrames::calculateVelocity;
    this->functions[1] = &currentFrames::redPointDetected;
}

Затем в someMethod в классе currentFrames я пытаюсь вызвать функцию-член:

void currentFrames::someMethod()
{
    CALL_MEMBER_FN(*this, this->functions[0])();
}

Но это дает мне segfault. Я попытался определить CALL_MEMBER_FN как((ptrToObject)->*(ptrToMember)), но это также дает segfault.

Как это должно быть сделано?Есть ли лучший способ добиться того, чего я хочу?

1 Ответ

8 голосов
/ 15 декабря 2011
    MyFuncPointerType functions[];

Вы забыли указать длину массива.Это сделает его равносильным MyFuncPointerType *functions.Указатель инициализируется по какому-либо адресу мусора (возможно, 0) и вызывает сегмент при доступе к this->functions[0] в конструкторе.Это не имеет ничего общего с CALL_MEMBER_FN.

Измените эту строку на

    MyFuncPointerType functions[2];

, и она должна работать.(Демо: http://ideone.com/q4D3e)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...