2014-02-18 4 views
0
//This is AsynchronousFunction class header file 

typedef int (*functionCall)(int, int); 

DWORD __stdcall functionExecuter(LPVOID pContext); // global function 

class AsynchronousFunction 
{ 

    int param1, param2; 
    functionCall fCall; 
    HANDLE m_handle; 

public: 
    AsynchronousFunction(functionCall, int, int); 
    ~AsynchronousFunction(); 
    int result(); 

protected: 
private: 
    int returnVal; 

}; 


It's implementation as follows 

AsynchronousFunction::AsynchronousFunction(functionCall fCall, int param1, int  param2):m_handle(CreateEvent(NULL , false , false , NULL)) 
{ 
    bool b = QueueUserWorkItem(functionExecuter, this, WT_EXECUTEDEFAULT); 

    WaitForSingleObject(m_handle, INFINITE); 
    SetEvent(m_handle); 
} 

AsynchronousFunction::~AsynchronousFunction() 
{ 
    CloseHandle(m_handle); 
} 

int AsynchronousFunction::result() 
{ 

    return 0;// not implemented yet 

} 

DWORD __stdcall functionExecuter(LPVOID pContext) 
{ 

    return 0; 

} 

здесь pContext получает «этот» указатель. моя попытка - получить param1 и param2
отсюда и сделать работу как я могу это сделать?Как передать «этот» указатель на глобальную функцию

ответ

1

Либо вы можете сделать functionExecuter друга AsynchronousFunction ИЛИ Добавить публичную функцию в AsynchronousFunction, которая делает необходимые вещи и вызвать его из functionExecuter, что-то, как показано ниже.

DWORD __stdcall functionExecuter(LPVOID pContext) 
{ 
    return (reinterpret_cast<AsyncrhonousFunction*>(pContext))->realFunctionExecuter(); 
} 
+0

Я лично предпочитаю избегать друзей, если это абсолютно необходимо, и даже тогда, чтобы догадаться и посмотреть, есть ли другой способ. Поэтому я предпочел бы, чтобы последний подход был первым. Кажется, это тоже чисто. – jia103

+0

@ jia103 Я согласен с тобой. Второй вариант выглядит более чистым. Я тоже лично избегаю функций друга –

+0

Спасибо. Я понял. поскольку pContext - это указатель на void, его нужно перевести в тип AsynchronousFunction. – Zarco

0

@sajas К сожалению, у меня нет явной ссылки, кроме как обратиться к книгам Скотт Мейерс или Herb Sutter книг; это только одна из тех вещей, которые я поднял на этом пути. В общем, вы не хотите разрушать инкапсуляцию, предоставляя личные данные, если это не нужно, что именно то, что делают friend. В этом случае, если вы решите изменить реализацию AsynchronousFunction завтра, а functionExecuter был ее другом, тогда более вероятно, что вы могли бы сломать functionExecuter, потому что это, возможно, полагалось на частных членов; с другой стороны, если это никогда не было другом для начала, вы должны были бы ввести код functionExecuter, используя только открытый интерфейс AsynchronousFunction.

Смежные вопросы