安全使用来自程序不同部分的实体

Safety using entity from different part of program

本文关键字:同部 实体 程序 安全      更新时间:2023-10-16

我的程序中有几个模块(例如数据库,调度程序),它们使用相同的实体 - 一些游戏服务器。

主要目标是每个模块使用功能有限的游戏服务器 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();
...

这样,您就可以确保对象仅在程序启动期间(第一条指令之前)构造一次,析构函数在程序结束时(在最后一条指令之后)被调用。当然,如果构造函数抛出异常,程序将在有机会显示任何内容之前突然停止:最终的错误消息应该显示在构造函数中。