2012-03-14 3 views
0

Я пытаюсь получить логическое значение из одной из двух функций-членов. Я хотел бы вызвать функцию-член (основной), который будет указывать на одну из двух функций-членов на основе значения, переданного основной ... вот то, что я до сих пор:Member Function Указатели в C++

class CRoutine{ 

    ... 
    BOOL (*MainRoutine(BOOL opcode))(); 
    static BOOL SubRoutine1(); 
    static BOOL SubRoutine2(); 
    ... 
    }; 

    BOOL (*CRoutine::MainRoutine(BOOL opcode))() 
    { 
     switch (opcode) 
     { 
     case false: 
      MessageBox(NULL, L"Routine1", L"Routine1", MB_OK); 
      return &CRoutine::SubRoutine1; 
     case true: 
      MessageBox(NULL, L"Routine2", L"Routine2", MB_OK); 
      return &CRoutine::SubRoutine2; 
     default: 
      MessageBox(NULL, L"Default Routine Selected", L"Routine1", MB_OK); 
      return &CRoutine::SubRoutine1; 
     } 
    } 

    BOOL CRoutine::SubRoutine1() 
    { 
     MessageBox(NULL, L"Routine1", L"Routine1", MB_OK); 
     return true; 
    } 
    BOOL CRoutine::SubRoutine2() 
    { 
     MessageBox(NULL, L"Routine2", L"Routine2", MB_OK); 
     return false; 
    } 

    winMain(...) 
    { 
    ... 
m_routine = new CRoutine(); 
    BOOL result = m_routine->MainRoutine(0); 
    ... 
    } 

Мой вопрос:

Как мне вызвать MainRoutine(), чтобы получить логическое значение из SubRoutine1() или SubRoutine2(). Когда я запускаю программу, как я получаю следующее сообщение об ошибке:

ошибка C2440: «инициализации»: не удается преобразовать из «BOOL (__cdecl *) (ничтожной)» до «BOOL»

В основном это теория, которую я Я заинтересован, я знаю, что есть другие способы получить такой простой ответ ... спасибо заранее.

+2

Использование 'bool' неявно как' int' и наоборот, вероятно, не очень хорошая идея. – AJG85

+0

C++ имеет настоящий тип 'bool'ean; почему вы используете макрос BOOL? –

ответ

2

Как это:

BOOL result = m_routine->MainRoutine(0)(); 

Это происходит потому, что вы возвращаете указатель на функцию от MainRoutine(0), таким образом, вам нужно еще пару скобок для вызова функции указал им.

Кстати, вы возвращаете указатель простой функции, а не указатель на функцию-член.

+0

как это? в MainRoutine? –

+0

@ P.Avery Да. Но это нормально, простые указатели функций используются для хранения указателя на статическую функцию-член. – Krizz

+0

спасибо за помощь, я могу запустить программу с меньшим количеством условных утверждений сейчас –