静态指针c++;使用 我对C++很陌生,这对我来说有点困惑。 我试着去理解一些代码源代码,在那里它做了一些类似的事情
使用3个指向3个类的静态指针 从main中分配这3个指针,以便为这3个类创建新对象 使用它们访问它们创建的类实例的成员 为什么不使用实例呢?所以他们在堆栈上创建它,而不是在没有函数作用域的堆上创建它?它已经在主楼了 这是代码源代码静态指针c++;使用 我对C++很陌生,这对我来说有点困惑。 我试着去理解一些代码源代码,在那里它做了一些类似的事情,c++,class,pointers,static,C++,Class,Pointers,Static,使用3个指向3个类的静态指针 从main中分配这3个指针,以便为这3个类创建新对象 使用它们访问它们创建的类实例的成员 为什么不使用实例呢?所以他们在堆栈上创建它,而不是在没有函数作用域的堆上创建它?它已经在主楼了 这是代码源代码 int _tmain(int argc, _TCHAR* argv[]) { ... SetConsoleTextAttribute(hStdOut, FOREGROUND_CYAN); printf("Creating Database... "
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;
在根的最末端
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();
}
为什么要这样做?有没有更好的方法来完成它?我想要一些解释,请和感谢静态成员意味着它们在类的所有实例中共享。由于类保存的可能是
CDatabaseRoot
的唯一实例,因此看起来该代码正在实现一个(尽管它在创建之前没有通过检查null来强制执行它,因此多次调用Create()
而不调用相应的Destroy()
可能会导致问题)。将数据成员公开也通常被认为是不好的形式,并且会导致错误
<> C++中有几种实现单体的方法。请参阅Alexandrescu的一些变体(),并参阅上面提到的Wikipedia文章了解其他几个变体。静态成员意味着它们在类的所有实例中共享。由于类保存的可能是
CDatabaseRoot
的唯一实例,因此看起来该代码正在实现一个(尽管它在创建之前没有通过检查null来强制执行它,因此多次调用Create()
而不调用相应的Destroy()
可能会导致问题)。将数据成员公开也通常被认为是不好的形式,并且会导致错误
<> C++中有几种实现单体的方法。请参阅Alexandrescu的一些变体(),并参阅上面提到的Wikipedia文章了解其他几个变体。似乎这样做是为了让除main之外的方法可以访问这些全局服务,而不必将它们作为参数传入。与单例模式类似,但没有保护(如果两次调用“Create”,会发生什么情况?) 其中。因此,您可以明智地查看该代码,并对此表示怀疑 我建议定义一个“上下文”结构(或类)来封装这些服务:
struct Context
{
CDatabaseRoot* Core;
CServerSocket* AuthServer;
CServerSocket* GameServer;
};
您可以在main中初始化它,然后将它传递到任何需要它的类或对象中 这样做似乎是为了让main以外的方法可以访问这些全局服务,而不需要将它们作为参数传入。与单例模式类似,但没有保护(如果两次调用“Create”,会发生什么情况?) 其中。因此,您可以明智地查看该代码,并对此表示怀疑 我建议定义一个“上下文”结构(或类)来封装这些服务:
struct Context
{
CDatabaseRoot* Core;
CServerSocket* AuthServer;
CServerSocket* GameServer;
};
您可以在main中初始化它,然后将它传递到任何需要它的类或对象中 如果构造函数检查以确保只有一个对象实例存在,如果存在,则返回它,而不是创建一个新实例,那么它将实现singleton模式,但它不是。正如另一位回答者所说,类的任何实例都将共享这些静态指针的相同含义。如果这些对象是方法,则可以调用这些方法,而无需首先创建对象的实例,因为它们是静态的,然而,这是另一个主题。如果构造函数检查以确保只有一个对象实例存在,并返回它,而不是创建一个新的实例,那么它将实现单例模式,但它不是。正如另一位回答者所说,类的任何实例都将共享这些静态指针的相同含义。如果这些对象是方法,则可以调用这些方法,而无需首先创建对象的实例,因为它们是静态的,但这是另一个主题。谢谢你,这绝对是一个很大的帮助,是的,我只想先了解它,然后优化它,并以更好的方式从头开始重新编码。谢谢你,这绝对是一个很大的帮助,是的,我只想首先了解它,然后优化它,并以更好的方式从头开始重新编码