class Event{
    operator HANDLE () { return _handle; }//如何理解?
private:
    HANDLE _handle;
};主要是:
operator HANDLE () 是运算符重载吗?如此重载后,程序中如何使用?

解决方案 »

  1.   

    //waveInOpen是动态连接库winmm.dll之函数,用以开启波形输入设备。
    status = waveInOpen (
            &_handle, 
            idDev, 
            &format, 
            (DWORD) HANDLE (event),//这里一般是回调函数地址或窗口句柄,用于处理录音数据,
                                   //现在是(DWORD) HANDLE (event),是否与上面有关系?
             0,  
            CALLBACK_EVENT);
      

  2.   

    隐式类型转换。
    CBitmap,CDC...等MFC都有这种转换,某种程度上提供一定便利。
    参见more effective C++中某条款之利弊。
      

  3.   


    Event evt;
    HANDLE h = evt;
    printf("%d", (HANDLE)evt)
      

  4.   

    operator HANDLE () { return _handle; }//如何理解?说是一个函数的话,返回类型是operator? 从来没见过。说是重载运算符(),那么似乎不应该有HANDLE。 现在是(DWORD) HANDLE (event),是否与上面有关系?如何理解?这与3楼的(HANDLE)evt不同吧?
      

  5.   

    自动类型转换
    假设你有一个class A,现在你有一个实例a=A()
    在某些时候,你希望a能自动变动布尔型,那在类A里就应该这样:
    class A
    {
    public:
        operator bool () const { return true/false accordingly; }
    }其它类型同理
      

  6.   

    more effective c++ 条款5.说的这么详细了。
      

  7.   

    要想理解,自己实践(去掉此operator看看编译会提示什么)+理论(书)
      

  8.   

    这就是一种类型转换,
    如果楼主你使用过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);
      

  9.   

    谢谢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();
    }