class CBoardPort  
{
public:
CBoardPort();
virtual ~CBoardPort();
protected:
        CWinThread *m_pProtThread;
        static UINT CBoardPort::LoopProtThread(LPVOID lParam);
        void SetIoOutState(void);
        void GetIOInState(void);
        void SetDAOutState(void); 
};/////////////////////////////
        LPVOID      pParam = NULL;
        int         nPriority = THREAD_PRIORITY_ABOVE_NORMAL;  
        UINT        nStackSize = 0;                           
        DWORD       dwCreateFlags = 0;                        
        LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ;        
        m_pProtThread =AfxBeginThread(CBoardPort::LoopProtThread,pParam,nPriority , nStackSize, dwCreateFlags , lpSecurityAttrs);
//////////////////
UINT CBoardPort::LoopProtThread(LPVOID lParam)
{
        while(1)
        {
                SetDAOutState();
                GetIOInState();
                SetIoOutState();
                Sleep(0);                                //暂时将线程时间交给其他线程(必须的)
}        
        return  0;
}报错:
: error C2352: 'CBoardPort::SetDAOutState' : illegal call of non-static member function
error C2352: 'CBoardPort::GetIOInState' : illegal call of non-static member function
error C2352: 'CBoardPort::SetIoOutState' : illegal call of non-static member function问:定义static UINT CBoardPort::LoopProtThread(LPVOID lParam);有问题?如果不定义静态就出错,问题在哪里?

解决方案 »

  1.   

    小小意见,仅供参考:
    1、定义static UINT CBoardPort::LoopProtThread(LPVOID lParam);定义的时候在类内部,不需要类名加域作用符吧
    2、静态方法里不能调用非静态的方法吧 
      

  2.   

    UINT LoopProtThread(LPVOID lParam)
    {
             CBoardPort* pDlg = (CBoardPort*)lParam;          //获取类句柄转换
            while(1)
            {
                    pDlg->SetDAOutState();
                    pDlg->GetIOInState();
                    pDlg->SetIoOutState();
                    Sleep(0);                                        }        
            return  0;
    }m_pProtThread =AfxBeginThread(LoopProtThread,pParam,nPriority , nStackSize, dwCreateFlags , lpSecurityAttrs)error C2248: 'SetDAOutState' : cannot access protected member declared in class 'CBoardPort'
     error C2248: 'GetIOInState' : cannot access protected member declared in class 'CBoardPort'
      

  3.   

    所以要定义成类的静态成员函数,是因为类的静态成员函数不属于某个类对象,这样在调用函数
    的时候就不用传递一个额外的this指针.public:
          void SetIoOutState(void);
            void GetIOInState(void);
            void SetDAOutState(void); UINT CBoardPort::LoopProtThread(LPVOID lParam)
    {
            CBoardPort* pClass = (CBoardPort*)lParam;          //获取从类句柄转换
            while(1)
            {
                    pClass->SetDAOutState();
                    pClass->GetIOInState();
                    pClass->SetIoOutState();
                    Sleep(0);                                        }        
            return  0;
    }
    就OK了