静态指针的c++用法
static pointer c++ usage
我是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++中的用法
- 当C++中需要自动删除时,这是静态的正确用法吗?
- libstdc++ 文件系统中未初始化的用法?
- 复制和交换习惯用法与移动操作之间的交互
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 命名参数习惯用法和(抽象)基类
- 省略号在C++中的所有用法
- () 在 C++ 11 中的特殊而奇怪的用法?
- 构造函数的用法
- 模板类中自动的类用法不完整
- 这里的 = 运算符有什么用法?
- 什么模板用法在阶乘中更好
- 如果可变长度元素的constexpr用法得到<>
- 为什么 setjmp/longjmp 的这种用法是未定义的行为?
- 访问提升:shared_ptr 主范围外崩溃,断言失败:px != 0.指针的正确用法是什么?
- C++ 中函数中 Const 用法之间的差异
- equal_to模板类C++用法
- PCL 中的 GICP 用法
- 向量的正确用法<int>::size_type
- C++命名空间的基本用法