Функция Указатель на нестатическую функцию-член? - PullRequest
0 голосов
/ 15 марта 2012

Можно ли использовать указатель на функцию для указания на нестатическую функцию-член? Я хотел бы указать на функцию-член, которая использует нестатические объекты и переменные из класса ... статические функции-члены не могут сделать это ...

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

Могу ли я указать на нестатические функции-члены?

Кроме того, экземпляр класса является указателем ... вот мой код:

class CRoutine{
int m_index;
    ...
        BOOL (*CallRoutine(char opcode))(DWORD, float, float, float);
        static BOOL Update(DWORD, float, float, float);
        static BOOL Transition(DWORD, float, float, float);
        static BOOL Revert(DWORD, float, float, float);
        static BOOL Sequence(DWORD, float, float, float);
    ...
    };
    BOOL (*CRoutine::CallRoutine(char opcode))(DWORD, float, float, float)
    {   
        switch ( opcode )
        {
        case 0:
            return &CRoutine::Update;
        case 1:
            return &CRoutine::Transition;
        case 2:
            return &CRoutine::Revert;
        case 3:
            return &CRoutine::Sequence;
        default:
            return &CRoutine::Update;
        }
    }
    BOOL CRoutine::Update(DWORD AnimSetIndex, float time, float tTime, float shift)
    {
        MessageBox(NULL, L"Updating", L"Routine #1", MB_OK);
         CRoutine::m_index++; // Error thrown here...       
return true;
    }
    BOOL CRoutine::Transition(DWORD AnimSetIndex, float time, float tTime, float shift)
    {
        MessageBox(NULL, L"Transitioning", L"Routine #2", MB_OK);
        return true;
    }
    BOOL CRoutine::Revert(DWORD AnimSetIndex, float time, float tTime, float shift)
    {
        MessageBox(NULL, L"Reverting", L"Routine #3", MB_OK);
        return true;
    }
    BOOL CRoutine::Sequence(DWORD AnimSetIndex, float time, float tTime, float shift)
    {
        MessageBox(NULL, L"Sequencing", L"Routine #4", MB_OK);
        return true;
    }

Вышеприведенная ошибка: ошибка C2597: недопустимая ссылка на нестатический член 'CRoutine :: m_index'

1 Ответ

1 голос
/ 15 марта 2012

Да, если вы можете изменить тип, в котором он хранится.

Используя std :: function abstract, вы можете связать все, что встречает определенную сигнатуру (т.е. принять x, вернуть y). будь то функтор, лямбда, связанная функция-член или свободная функция.

struct bar{
     void foo(){
          std::cout << "HI" << std::endl;
    } 
};

int main(){

    bar b;
    //using std::function instead of a func*
    std::function<void()> func(
                 std::bind(&bar::foo, &b));

    func();
}

Обратите внимание, что для использования std :: function требуется C ++ 11, boost также имеет очень похожую версию, которую можно использовать с C ++ 98

...