operator HANDLE () { return _handle; }如何理解? class Event{ operator HANDLE () { return _handle; }//如何理解?private: HANDLE _handle;};主要是:operator HANDLE () 是运算符重载吗?如此重载后,程序中如何使用? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //waveInOpen是动态连接库winmm.dll之函数,用以开启波形输入设备。status = waveInOpen ( &_handle, idDev, &format, (DWORD) HANDLE (event),//这里一般是回调函数地址或窗口句柄,用于处理录音数据, //现在是(DWORD) HANDLE (event),是否与上面有关系? 0, CALLBACK_EVENT); 隐式类型转换。CBitmap,CDC...等MFC都有这种转换,某种程度上提供一定便利。参见more effective C++中某条款之利弊。 是Event evt;HANDLE h = evt;printf("%d", (HANDLE)evt) operator HANDLE () { return _handle; }//如何理解?说是一个函数的话,返回类型是operator? 从来没见过。说是重载运算符(),那么似乎不应该有HANDLE。 现在是(DWORD) HANDLE (event),是否与上面有关系?如何理解?这与3楼的(HANDLE)evt不同吧? 自动类型转换假设你有一个class A,现在你有一个实例a=A()在某些时候,你希望a能自动变动布尔型,那在类A里就应该这样:class A{public: operator bool () const { return true/false accordingly; }}其它类型同理 more effective c++ 条款5.说的这么详细了。 要想理解,自己实践(去掉此operator看看编译会提示什么)+理论(书) 这就是一种类型转换,如果楼主你使用过CString,你就会发现CString对象可以传入LPCTSTR为参数的函数中.比如有个函数是这样的: OpenFile(LPCTSTR strFileName);你会发现可以直接传入CString对象进去.比如: CString strName=TEXT("c:\\a.txt");直接使用;OpenFile(strName);这样就可以.而不需要把CString先转换成TCHAR buf[];这就是因为CString有这个operator TCHAR*()的方法.可以再举个简单例子:比如有函数: int addOne(int a){ a++; return a;}class Int{public: int m_val;};哪果没有 operator int(){return m_val;}Int val;你调用 addOne的时候就得 addOne(val.m_val);如果有了operator int(){return m_val;}你就可以直接这样调用函数: addOne(val); 谢谢j8daxue,原来没有看过more effective c++,刚刚看了下电子书条款5。class Event{public: Event () { // start in non-signaled state (red light) // auto reset after every Wait _handle = CreateEvent (0, FALSE, FALSE, 0); } ~Event () { CloseHandle (_handle); } ..... operator HANDLE () { return _handle; }//???private: HANDLE _handle;};(DWORD) HANDLE (event)可以改为(DWORD)(HANDLE)event;这个代码费解的是居然用event这个vc保留字作变量名,我改为event1也可以。inline BOOL WaveInDevice::Open (UINT idDev, WaveFormat& format, Event& event1){ //waveInOpen是动态连接库winmm.dll之函数,用以开启波形输入设备。 _status = waveInOpen ( &_handle, idDev, &format, (DWORD)(HANDLE)event1,//回调函数地址或窗口句柄; 用于处理录音数据,这里HANDLE{ setevent;}一个事件 0, // callback instance data CALLBACK_EVENT); return Ok();}谢谢j8daxue,原来没有看过more effective c++,刚刚看了下电子书条款5。class Event{public: Event () { // start in non-signaled state (red light) // auto reset after every Wait _handle = CreateEvent (0, FALSE, FALSE, 0); } ~Event () { CloseHandle (_handle); } ..... operator HANDLE () { return _handle; }//???private: HANDLE _handle;};(DWORD) HANDLE (event)inline BOOL WaveInDevice::Open (UINT idDev, WaveFormat& format, Event& event1){ //waveInOpen是动态连接库winmm.dll之函数,用以开启波形输入设备。 _status = waveInOpen ( &_handle, idDev, &format, (DWORD)(HANDLE)event1,//回调函数地址或窗口句柄; 用于处理录音数据,这里HANDLE{ setevent;}一个事件 0, // callback instance data CALLBACK_EVENT); return Ok();} 如何点击树控件弹出一个对话框 VS2010开发的程序不能运行??? 问个难点的问题 win32 console程序中打印进度字符的问题 不响应右键消息,如何添加右键菜单? 关于自定义的对话框不能显示的问题,谢谢 instance类,用他来做什么的呀,给解释一下,还有一些数据类型 我已经获得了窗口的句柄,怎样引用这个窗口 请大家给我的共享软件提提意见(vc++6.0) VS2010 MFC 如何给一个List Contrl 控件,关联一个 自己的 CMyListCtrl 类? 在vc里面调用DLL 中的函数,运行后出现内存报错 工具栏创建的问题
status = waveInOpen (
&_handle,
idDev,
&format,
(DWORD) HANDLE (event),//这里一般是回调函数地址或窗口句柄,用于处理录音数据,
//现在是(DWORD) HANDLE (event),是否与上面有关系?
0,
CALLBACK_EVENT);
CBitmap,CDC...等MFC都有这种转换,某种程度上提供一定便利。
参见more effective C++中某条款之利弊。
Event evt;
HANDLE h = evt;
printf("%d", (HANDLE)evt)
假设你有一个class A,现在你有一个实例a=A()
在某些时候,你希望a能自动变动布尔型,那在类A里就应该这样:
class A
{
public:
operator bool () const { return true/false accordingly; }
}其它类型同理
如果楼主你使用过CString,你就会发现CString对象可以传入LPCTSTR为参数的函数中.比如有个函数是这样的: OpenFile(LPCTSTR strFileName);
你会发现可以直接传入CString对象进去.
比如:
CString strName=TEXT("c:\\a.txt");
直接使用;
OpenFile(strName);这样就可以.而不需要把CString先转换成TCHAR buf[];这就是因为CString有这个operator TCHAR*()的方法.
可以再举个简单例子:
比如有函数:
int addOne(int a)
{
a++;
return a;
}class Int
{
public:
int m_val;
};哪果没有 operator int(){return m_val;}Int val;
你调用 addOne的时候就得
addOne(val.m_val);如果有了operator int(){return m_val;}
你就可以直接这样调用函数:
addOne(val);
{
public:
Event ()
{
// start in non-signaled state (red light)
// auto reset after every Wait
_handle = CreateEvent (0, FALSE, FALSE, 0);
}
~Event ()
{
CloseHandle (_handle);
}
.....
operator HANDLE () { return _handle; }//???
private:
HANDLE _handle;
};(DWORD) HANDLE (event)可以改为(DWORD)(HANDLE)event;这个代码费解的是居然用event这个vc保留字作变量名,我改为event1也可以。inline BOOL WaveInDevice::Open (UINT idDev, WaveFormat& format, Event& event1)
{
//waveInOpen是动态连接库winmm.dll之函数,用以开启波形输入设备。
_status = waveInOpen (
&_handle,
idDev,
&format,
(DWORD)(HANDLE)event1,//回调函数地址或窗口句柄; 用于处理录音数据,这里HANDLE{ setevent;}一个事件
0, // callback instance data
CALLBACK_EVENT);
return Ok();
}谢谢j8daxue,原来没有看过more effective c++,刚刚看了下电子书条款5。class Event
{
public:
Event ()
{
// start in non-signaled state (red light)
// auto reset after every Wait
_handle = CreateEvent (0, FALSE, FALSE, 0);
}
~Event ()
{
CloseHandle (_handle);
}
.....
operator HANDLE () { return _handle; }//???
private:
HANDLE _handle;
};(DWORD) HANDLE (event)inline BOOL WaveInDevice::Open (UINT idDev, WaveFormat& format, Event& event1)
{
//waveInOpen是动态连接库winmm.dll之函数,用以开启波形输入设备。
_status = waveInOpen (
&_handle,
idDev,
&format,
(DWORD)(HANDLE)event1,//回调函数地址或窗口句柄; 用于处理录音数据,这里HANDLE{ setevent;}一个事件
0, // callback instance data
CALLBACK_EVENT);
return Ok();
}