//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
从这里开始工作
我怎么能这样做?
答案 0 :(得分:1)
您可以让functionExecuter
成为AsynchronousFunction
的朋友
要么
在AsynchronousFunction
中添加一个公共函数,该函数执行所需的操作并从functionExecuter
调用它,如下所示。
DWORD __stdcall functionExecuter(LPVOID pContext)
{
return (reinterpret_cast<AsyncrhonousFunction*>(pContext))->realFunctionExecuter();
}
答案 1 :(得分:0)
@sajas对不起,我没有明确的参考,除了参考Scott Meyers的书或Herb Sutter书籍;这只是我沿途拾起的那些东西之一。通常,如果不需要私有数据,您不希望通过公开私有数据来破解封装,这正是friend
所做的。在这种情况下,如果您决定明天更改AsynchronousFunction
的实施并且functionExecuter
是其朋友,则您更有可能违反functionExecuter
,因为它可能依赖于私人成员;另一方面,如果它从来不是一个朋友,那么你将不得不使用functionExecuter
的公共接口来编码AsynchronousFunction
。