Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
静态指针c++;使用 我对C++很陌生,这对我来说有点困惑。 我试着去理解一些代码源代码,在那里它做了一些类似的事情_C++_Class_Pointers_Static - Fatal编程技术网

静态指针c++;使用 我对C++很陌生,这对我来说有点困惑。 我试着去理解一些代码源代码,在那里它做了一些类似的事情

静态指针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... "

使用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;
在根的最末端

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模式,但它不是。正如另一位回答者所说,类的任何实例都将共享这些静态指针的相同含义。如果这些对象是方法,则可以调用这些方法,而无需首先创建对象的实例,因为它们是静态的,然而,这是另一个主题。

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

谢谢你,这绝对是一个很大的帮助,是的,我只想先了解它,然后优化它,并以更好的方式从头开始重新编码。谢谢你,这绝对是一个很大的帮助,是的,我只想首先了解它,然后优化它,并以更好的方式从头开始重新编码