查询类的静态成员变量

Query on Static member variables of a class

本文关键字:变量 静态成员 查询      更新时间:2023-10-16

我用这种方式定义了几个类:

class CSocket {
    protected:
        int m_SockWorking;
        int InitSocket();
        void CleanSocket();
}
class CSocketClient : public CSocket {
    public:
        CSocketClient();
        int InitClient();
}
class CApi {
    static CSocketClient c1;
    public:
        // other methods defined 
}
现在,在主例程中,我创建了两个类CApi的对象。我知道,对于静态成员变量,每个类只存在一个副本。但是,我如何访问CSocketClient成员变量的m_SockWorking变量呢?这两个对象是否有该非静态成员变量的两个副本?有人能解释一下吗?

所有CApi类将共享一个静态CSocketClient变量。

m_SockWorkingCSocket的受保护成员,由CSocketClient继承,这使得它成为CApi和应用程序上下文中的私有变量。因此,您可以通过使用访问器和mutator函数来访问它。

每个CSocketClient都有自己的m_SockWorking变量。由于所有CApi都共享相同的CSocketClient类,它们都共享相同的m_SockWorking变量。

CSocket.h

class CSocket {
  protected:
    int m_SockWorking;
    int InitSocket();
    void CleanSocket();
  public:
    void setSocket(int val){ m_SockWorking = val; } /* added these functions to show how to accessing m_SockWorking can be done */
    int getSocket() const { return m_SockWorking; }
};
class CSocketClient : public CSocket {
  public:
    CSocketClient();
    int InitClient();
};
class CApi {
  static CSocketClient c1;
  public:
    // other methods defined 
};

main.cc

#include "CSocket.h"
#include <iostream>
using std::cout;
using std::endl;
int main(){
  CApi a, b;
  CSocketClient c2;
  a.c1.setSocket(0); /* sets static c1 m_SockWorking variable to 0 */
  cout << b.c1.getSocket() << endl; /* will print 0 since c1 is a static variable */
  c2.setSocket(1); /* set c2 m_SockWorking to 1 */
  cout << c2.getSocket() << endl; /* will print 1 */
  cout << a.c1.getSocket() << endl; /* will print 0 */
}

0
1
1

是的,对象c1是唯一的,因此,c1中的所有数据成员对于CApi都是唯一的。

也许这样更容易理解:

静态对象c1是一个独立的&"CLASS"CApi的唯一对象,可由CApi的对象访问。它属于类,而不属于CApi的任何对象;