我是c ++的新手,这对我来说有点混乱 我试图理解一些代码源,它正在做像
这样的事情使用3个类的3个静态指针 从main分配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();
在cpp
CDatabaseRoot* CDatabaseRoot::Core;
CServerSocket* CDatabaseRoot::AuthServer;
CServerSocket* CDatabaseRoot::GameServer;
void CDatabaseRoot::Create()
{
CDatabaseRoot::Core = new CDatabaseRoot();
CDatabaseRoot::AuthServer = new CServerSocket();
CDatabaseRoot::GameServer = new CServerSocket();
}
为什么这样做?有没有更好的方法来完成它?我想请一些解释,谢谢
答案 0 :(得分:2)
静态成员意味着它们在类的所有实例之间共享。由于该类持有CDatabaseRoot
的 唯一实例,看起来代码正在实现singleton pattern(尽管它没有通过检查null来强制执行它在创建之前,所以多次调用Create()
而不调用相应的Destroy()
可能会导致问题)。使数据成员公开通常也被认为是错误的形式和错误的处方。
有几种方法可以在C ++中实现单例。有关变体(Modern C++ Design),请参阅Alexandrescu的code available here,并参阅上面提到的维基百科文章。
答案 1 :(得分:2)
看起来这样做了,所以main以外的方法可以访问这些全局服务,而不会将它们作为参数传入。类似于Singleton模式但没有保护(如果“Create”被调用两次会发生什么?)。
哪个is a bad idea in the first place。所以你很聪明地看一下这段代码并且有点怀疑。
我建议改为定义一个封装这些服务的“上下文”结构(或类):
struct Context
{
CDatabaseRoot* Core;
CServerSocket* AuthServer;
CServerSocket* GameServer;
};
您可以在main中初始化它,然后将其传递给任何需要它的类或对象。
答案 2 :(得分:1)
如果构造函数检查以确保只存在该对象的一个实例并返回它,如果它不是创建一个实例,那么它将实现单例模式,但事实并非如此。就像另一个回答者说的那样,你的类的任何实例都会分享那些静态指针的相同意义。如果这些对象是方法,则可以先调用方法而不创建对象的实例,因为它们是静态的,但这是另一个主题。