我在一个类(CThreadDlg)的头文件中看到了以下这些静态成员:
static HWND s_hWnd;
static CRgn s_RgnLT;
static CRgn s_RgnLB;
static CRgn s_RgnRT;
static CRgn s_RgnRB;
static bool s_bLT;
static bool s_bRT;
static bool s_bLB;
static bool s_bRB; static UINT RBFunc(LPVOID lpv);
static UINT RTFunc(LPVOID lpv);
static UINT LBFunc(LPVOID lpv);
static UINT LTFunc(LPVOID lpv);
static void Tranc(CRect rcWnd,CRgn& WndRgn);
在相应的实现文件中的构造函数前看到了这样的定义全局变量的代码:
HWND CThreadDlg::s_hWnd;
CRgn CThreadDlg::s_RgnLT;
CRgn CThreadDlg::s_RgnLB;
CRgn CThreadDlg::s_RgnRT;
CRgn CThreadDlg::s_RgnRB;
bool CThreadDlg::s_bLT;
bool CThreadDlg::s_bRT;
bool CThreadDlg::s_bLB;
bool CThreadDlg::s_bRB;////////////////////////////////////////////////////////////////////////////
// CThreadDlg dialog
CThreadDlg::CThreadDlg(CWnd* pParent /*=NULL*/)
: CDialog(CThreadDlg::IDD, pParent)
{

好郁闷,头文件里已经定义了静态成员变量,为什么实现文件顶部还要定义,而且变量前加类名?
还有就是静态成员(包括变量和函数)和非静态的有什么区别,请高手通俗的讲一下,尤其是静态成员函数?

解决方案 »

  1.   

    static HWND s_hWnd;
    static CRgn s_RgnLT;
    static CRgn s_RgnLB;
    static CRgn s_RgnRT;
    static CRgn s_RgnRB;
    static bool s_bLT;
    static bool s_bRT;
    static bool s_bLB;
    static bool s_bRB;
    这些应该是声明的全局静态变量,
    至于下面的这些,应该不是全局变量了,CThreadDlg::在这里就是指定了类域了
    说明这些变量是类的成员变量的应该,在相应类的cpp文件中,就应该是在类定义外部进行初始化的
    你再看看在类的头文件的类定义中是否定义了这些相应的成员变量,
    注意要达到在类定义之外用类域操作符来引用成员变量或者函数,则被引用的成员在类定义时必须
    被定义为类的static成员的
    HWND CThreadDlg::s_hWnd;
    CRgn CThreadDlg::s_RgnLT;
    CRgn CThreadDlg::s_RgnLB;
    CRgn CThreadDlg::s_RgnRT;
    CRgn CThreadDlg::s_RgnRB;
    bool CThreadDlg::s_bLT;
    bool CThreadDlg::s_bRT;
    bool CThreadDlg::s_bLB;
    bool CThreadDlg::s_bRB;
    至于静态成员函数,
    首先它一般是用来操作该类的静态成员变量的;
    其次就是静态成员变量是属于类的而不是属于该类的某个对象的,所以一般都如下初始化:
    bool CThreadDlg::s_bRB = false; 它在内存中的存储单位不是在你实例化类的时候分配的
      

  2.   

    注意要达到在类定义之外用类域操作符来引用成员变量或者函数,则被引用的成员在类定义时必须
    被定义为类的static成员的?
    类定义之外包括实现文件的函数内部和外部吗?为什么类的头文件中都定义了这些静态变量,实现文件的函数外还要写一下,不写编辑会出错? 
    还有这样做的实际意义是什么?
      

  3.   

    不好意思,这里说的声明方法是在类域之外使用类域操作符 ::来引用或者初始化
    类的成员变量 
    class myClass
    {
    public:
        static UINT nTotalNum;
        myClass();
        ~myClass();
        ......
    }
    我们可以初始化在全局域中使用:
      myClass::nTotalNum = 0;当然也可以用这样的方式引用这个成员变量。
        一般的我们的类成员变量都是private的,所以我们不能直接的引用,所以产生了使用
    静态成员函数来引用静态成员变量的方法,静态成员函数是只访问静态成员变量的函数,
    因而它们与使用哪个对象来调用这个函数无关,而且这种调用也不会访问或修改任何非
    static成员。
    至于你的类头文件中的那些则是全局静态变量的声明(否则很容易出现重复定义的错误),
    定义一定是在其他的什么实现文件中的。类中的成员静态变量当然很有用,比如类:
    class SaleTV
    {
    private:
         //一些卖出的电视的属性等等
         static UINT nTotalNum;  //可以记录一共卖出了多少台
    }
    显然这里nTotalNum是应该和类相关的概念,而不是和某一个卖出去的电视(对象)
    相关的概念了;有不对的地方,请指出  :)
      

  4.   

    HWND CThreadDlg::s_hWnd;
    CRgn CThreadDlg::s_RgnLT;
    CRgn CThreadDlg::s_RgnLB;
    CRgn CThreadDlg::s_RgnRT;
    CRgn CThreadDlg::s_RgnRB;
    bool CThreadDlg::s_bLT;
    bool CThreadDlg::s_bRT;
    bool CThreadDlg::s_bLB;
    bool CThreadDlg::s_bRB;这不叫全局变量,这叫定义CThreadDlg类的静态变量。
    .h中的叫“声明”静态变量,cpp中的是“定义”静态变量。却一不可
      

  5.   

    呵呵 原来你所说的
     static HWND s_hWnd;
    static CRgn s_RgnLT;
    static CRgn s_RgnLB;
    static CRgn s_RgnRT;
    static CRgn s_RgnRB;
    static bool s_bLT;
    static bool s_bRT;
    static bool s_bLB;
    static bool s_bRB;
    是在类定义中出现的,我还以为是在全局域中出现的呢,
    不过还好,只是理解上的错误,知识上没有出现错误  :)