class CWaveOut  
{
public:
static DWORD WINAPI AudioOutThreadProc(LPVOID lpParameter);
//....
protected:
friend DWORD WINAPI AudioOutThreadProc(LPVOID lpParameter);
};
DWORD WINAPI CWaveOut::AudioOutThreadProc(LPVOID lpParameter){
//...
}
----------------------------------------------------
看不大懂怎么会有两声明? 
为什么声明成这个样子?
请大家说清楚了,谢谢!

解决方案 »

  1.   

    //表示定义了一个静态的友元函数
    class CWaveOut  
    {
    public:
    static DWORD WINAPI AudioOutThreadProc(LPVOID lpParameter);
    //....静态函数声明,需要在类的外部定义
    protected:
    friend DWORD WINAPI AudioOutThreadProc(LPVOID lpParameter);
             //友元函数声明,表示这个函数可以访问类CWaveOut的成员
    };
    //
    DWORD WINAPI CWaveOut::AudioOutThreadProc(LPVOID lpParameter)
    {
    //...
    }
      

  2.   

    上面的形式效果应该和这个一样:
    class CWaveOut  
    {
    public:
     friend void AudioOutThreadProc(int lpParameter);
    private:
     int a;
    };
    void AudioOutThreadProc(int lpParameter)
    {
       CWaveOut t;
       t.a=5;
    }
      

  3.   

    class CWaveOut  
    {
    public:
    static DWORD WINAPI AudioOutThreadProc(LPVOID lpParameter);
    BOOL StartThread()
    //....
    protected:
    friend DWORD WINAPI AudioOutThreadProc(LPVOID lpParameter);
    };
    DWORD WINAPI CWaveOut::AudioOutThreadProc(LPVOID lpParameter){
    //...
    }BOOL CWaveOut::StartThread()
    {
    //...
    m_hAudioOut=CreateThread(0,0,AudioOutThreadProc,this,0,&m_dwAudioOutId);
    //...
    }
    怎么一个实现函数,既可以是友元,可以是静态,并且还是分开声明的?
    假如就声明成一个友元行吗?究竟是怎么回事,晕了!!
      

  4.   

    只能说明写代码的这个人不厚道:)这里CWaveOut的静态函数就不说了。友元函数说一下:友元函数仅仅是向编译器说明此函数是我的一个朋友,可以访问我的任何变量,既不是函数声明,也不是函数定义。你把该友元函数改称别的名字就不会造成混淆了,这里再次谴责写代码的一下,谁让他把两个函数名搞得相同!-------------------------------------------------------
    MyCSDN - CSDN离线数据浏览工具。(恒金软件出品)  
    可下载论坛文件、文档文章和全文搜索论坛数据以供离线浏览。支持签名回复。
    下载地址:http://nj.onlinedown.net/soft/6591.htm
      

  5.   

    这种写法相当于写成这样:static friend DWORD WINAPI AudioOutThreadProc(LPVOID lpParameter);定义了一个静态的友员函数而已,写成这样就不犯糊涂了吧,意思是一样的。
      

  6.   

    楼上说得不对-------------------------------------------------------
    MyCSDN - CSDN离线数据浏览工具。(恒金软件出品)  
    可下载论坛文件、文档文章和全文搜索论坛数据以供离线浏览。支持签名回复。
    下载地址:http://nj.onlinedown.net/soft/6591.htm
      

  7.   

    原因:
    你自己仔细看函数的说明, 有"ThreadProc"对吧?证明这是一个线程处理函数,
    你再查查MSDN的线程处理函数的声明必须是什么格式,对了,必须是一个全局函数,
    标准格式是:
    DWORD WINAPI ThreadProc(
      LPVOID lpParameter
    );
    那么在一个类里面,怎么声明一个全局函数了,那就是使用静态函数了,所有是static修饰
      

  8.   

    纠正楼上:线程处理函数要看生存期,而不是是否为全局函数,类的静态函数也可以。全局函数和类的静态函数虽然相似,却还是不同的。
    1.作用域不同。全局函数的作用域是全局,而类的静态函数作用域是该类。这就限定了全局函数不能够访问类的私有和保护变量而类的静态函数就能。
    2.限制不同。每个类都可以有名为GetClassID这样的静态函数,而全局函数有且仅能有一个名为GetClassID的函数。-------------------------------------------------------
    MyCSDN - CSDN离线数据浏览工具。(恒金软件出品)  
    可下载论坛文件、文档文章和全文搜索论坛数据以供离线浏览。支持签名回复。
    下载地址:http://nj.onlinedown.net/soft/6591.htm