静态指针的c++用法

static pointer c++ usage

本文关键字:用法 c++ 指针 静态      更新时间:2023-10-16

我是c++的新手,这对我来说有点困惑我试图理解一些代码源代码,它做的事情像

使用3个静态指针指向3个类从主函数中分配3个指针来为这3个类创建新对象使用它们来访问它们创建的类的实例的成员为什么不直接使用实例呢?所以他们在没有函数作用域的情况下在堆栈上而不是堆上创建它?它已经是主旋律了下面是代码源

int _tmain(int argc, _TCHAR* argv[])
{
...
    SetConsoleTextAttribute(hStdOut, FOREGROUND_CYAN);
    printf("Creating Database... ");
    CDatabaseRoot::Create();
    SetConsoleTextAttribute(hStdOut, FOREGROUND_LIME);
    WriteLn("Completed.");
    SetConsoleTextAttribute(hStdOut, FOREGROUND_CYAN);
    printf("Creating Servers... ");
    CDatabaseRoot::AuthServer->Port = 9958;
    CDatabaseRoot::AuthServer->OnClientConnect = AuthConnect;

在CDatabaseRoot结束时

class CDatabaseRoot
{
public:
    static CDatabaseRoot* Core;
    static CServerSocket* AuthServer;
    static CServerSocket* GameServer;
    static void Create();
    static void Destroy();

CDatabaseRoot* CDatabaseRoot::Core;
CServerSocket* CDatabaseRoot::AuthServer;
CServerSocket* CDatabaseRoot::GameServer;
void CDatabaseRoot::Create()
{
    CDatabaseRoot::Core = new CDatabaseRoot();
    CDatabaseRoot::AuthServer = new CServerSocket();
    CDatabaseRoot::GameServer = new CServerSocket();
}

为什么要这样做?有没有更好的方法来完成它?我需要一些解释,谢谢

似乎这样做是为了使main以外的方法可以访问这些全局服务,而不需要将它们作为参数传递。类似于Singleton模式,但没有保护(如果"Create"被调用两次会发生什么?)

这首先是一个坏主意。所以你很聪明,看了这段代码,有点怀疑。

我建议定义一个"上下文"结构(或类)来封装这些服务:
struct Context
{
    CDatabaseRoot* Core;
    CServerSocket* AuthServer;
    CServerSocket* GameServer;
};

你可以在main中初始化它,然后传递给任何需要它的类或对象。

静态成员意味着它们在类的所有实例之间共享。由于该类持有CDatabaseRoot唯一实例,因此看起来代码正在实现单例模式(尽管在创建之前没有通过检查null来强制执行,因此多次调用Create()而不调用相应的Destroy()可能会导致问题)。将数据成员公开通常也被认为是不好的形式,并且会导致bug。

在c++中有几种实现单例的方法。参见Alexandrescu的Modern c++ Design获得一些变体(此处可获得代码),并参阅上面提到的其他几个维基百科文章。

如果构造函数检查以确保只有一个对象实例存在,并返回它,而不是创建一个新的,那么它将实现单例模式,但它不是。正如另一个回答者所说,类的任何实例都将共享这些静态指针的相同实例。如果这些对象是方法,则可以调用这些方法,而不必首先创建对象的实例,因为它们是静态的,但这是另一个主题。