C++的静态成员函数访问非静态成员变量

  • Post author:
  • Post category:其他


我们知道,其实在C++中想要在静态成员函数中访问非静态成员变量是不可行的,因为静态成员变量是属于类的,而不是对象的,可能对象还未初始化的时候我们就去访问非静态的成员变量,这时就会发生错误。下面写个简单的例子说明下:

#include <iostream>
using namespace std;

class Demo
{
  public:
       Demo(int i)
       {
           this->m_data = i;
       }
       static int getNumber()
       {
           return m_data;
       }
  public:
      int m_data;
 };

int main()
{
    cout<<Demo::getNumber()<<endl;
}

此时我们编译过后会发生错误。

那么如果我们有时候可能确实需要在静态成员函数中访问非静态成员变量,那我们该怎么做呢?

首先为了接下来的描述,我先定义一个单例模板类:

#include <stdlib.h>

template<class T>
class TSingleton
{
public:
    //create
    static void Create()
    {
        if ( !ms_pObject )
        {
            ms_pObject = new T;
        }
    }

    //destroy
    static void Destroy()
    {
        if ( ms_pObject )
        {
            delete ms_pObject;
            ms_pObject = NULL;
        }
    }

    //get instance
    static T* Get()
    {
        Create();
        return ms_pObject;
    }

protected:
    static T*    ms_pObject;
};
template<class T> 
T* TSingleton<T>::ms_pObject = NULL;

接下来我们从TSingleton派生一个类:

//UserData.h 头文件如下:

#include "TSingleton.h"
class   UserData : public TSingleton<UserData>
{
     public:
          UserData();
          static unsigned int getNumber();
    public:
          int m_data;   
};

//UserData.cpp 实现文件如下

#include "UserData.h"
UserData::UserData()
{     
    this->m_data = 0;
}
unsigned int UserData::getNumber()
{
    return UserData::Get()->m_data;
}

然后对其调用的主函数如下所示:

//main.cpp

#include "UserData.h"
int  main()
{
    cout<<UserData::getNumber()<<endl;
}

此时我们编译过后没有发现任何错误,其实这里是利用了指针来在静态成员函数中访问非静态成员变量,也其实使我们仿造了一个”this”指针。



版权声明:本文为u014752853原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。