安全使用来自程序不同部分的实体
Safety using entity from different part of program
我的程序中有几个模块(例如数据库,调度程序),它们使用相同的实体 - 一些游戏服务器。
主要目标是每个模块使用功能有限的游戏服务器 API(仅需要单独模块和游戏服务器之间交互的功能),并且必须隐藏其他功能。
我已经创建了这样的功能。但我现在不知道,也许是错误的实现,或者有人猜测更好的方法。
放置在下面的类包含一些操作,这些操作只能通过类包装器从其他模块访问。
#ifndef _GAMESERVER_
#define _GAMESERVER_
#include <vector>
class GameServer
{
static GameServer instance;
std::vector<int> game_actions;
GameServer(){}
~GameServer(){}
GameServer(const GameServer&){}
protected:
void addGameAction(int action) // Some functionality, which can be accessible only from others modules via classes wrapers
{
game_actions.push_back(action);
}
public:
static GameServer *getInstance()
{
return &instance;
}
bool start()
{
return true;
}
void stop()
{
}
};
#endif
下面放置了类"包装器"用于类游戏服务器,该类已经实现了与模块数据库交互的API。
#ifndef _DBGAMESERVER_
#define _DBGAMESERVER_
/* Database module will use this API for interacting with game server */
class GameServer;
class DBGameServer : protected GameServer
{
DBGameServer();
public:
static DBGameServer *getInstance()
{
return static_cast<DBGameServer *>(GameServer::getInstance());
}
void addGameAction(int action)
{
GameServer::addGameAction(action);
}
};
#endif
谢谢!
您是在第一次调用 getIntance
时创建单一实例。在多线程应用程序中可能是不安全的:竞争条件可能导致多个实例被实际初始化和使用。
恕我直言,您最好使用静态初始化:
声明:
...
class GameServer {
static GameServer& instance;
// private constructor, copie constructor and destructor
...
public:
static GameServer * getInstance() { return &instance; }
...
}
实现:
...
GameServer & GameServer::instance = GameServer();
...
这样,您就可以确保对象仅在程序启动期间(第一条指令之前)构造一次,析构函数在程序结束时(在最后一条指令之后)被调用。当然,如果构造函数抛出异常,程序将在有机会显示任何内容之前突然停止:最终的错误消息应该显示在构造函数中。
相关文章:
- 使用指针重新分析实体
- 在C++中,我如何接受不同于同一行的用户输入
- 如何创建从同一类继承的不同对象的向量
- 如何使用tinyxml2从XML加载父实体和子实体
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 不能将 "void *" 类型的值分配给类型 "TCHAR" 的实体
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 如何将部分流作为参数传递
- C++如何将同一类的实例作为属性
- 在TFHE(完全快速同态加密)上执行除法
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- 如何在 ECS 模型中组织实体?
- 如何使用运算符在同一行中多次调用函数
- 如何使用connect将qml按钮与同一类的cpp函数连接起来
- 如何格式化我的文本文件以使其不会一遍又一遍地重复同一行?
- C++交换来自同一类成员的参数值,处理多个类
- 为什么我们不在下面给出的代码中使用指针来实例化C++的实体对象?
- C++找出覆盖同一行的数组
- 使用同一类中的方法重新分配字段时出现问题