C++ 跨平台代码组织
我有一个monitor类,它通过一个静态函数访问自身的实例。调用GetMonitor时,将搜索Commonitors映射并返回实例,如果实例不存在,则创建实例C++ 跨平台代码组织,c++,oop,singleton,C++,Oop,Singleton,我有一个monitor类,它通过一个静态函数访问自身的实例。调用GetMonitor时,将搜索Commonitors映射并返回实例,如果实例不存在,则创建实例 class Monitor { public: static Monitor& GetPrimaryMonitor(); static Monitor& GetMonitor(int number = 0); int GetXResolution();
class Monitor {
public:
static Monitor& GetPrimaryMonitor();
static Monitor& GetMonitor(int number = 0);
int GetXResolution();
int GetYResolution();
void SetXResolution(int resolution);
void SetYResolution(int resolution);
protected:
private:
Monitor(int number);
static std::map<int, Monitor*> mMonitors;
};
类监视器{
公众:
静态监视器&GetPrimaryMonitor();
静态监视器和GetMonitor(整数=0);
int GetXResolution();
int GetYResolution();
无效SETX分辨率(整数分辨率);
无效设置分辨率(int分辨率);
受保护的:
私人:
监视器(int编号);
静态std::映射编辑器;
};
我的问题是,我应该什么时候删除地图中的Monitor实例?或者我应该采取不同的方法,允许用户创建他/她想要的尽可能多的监视器实例?这似乎是错误的,因为这就好像他们将创建一个物理监视器,而我的方法允许访问已经可用的共享资源。提前感谢,ell.您不需要删除监视器的实例(考虑到您的系统不会连接那么多监视器设备,这不会是一个问题)。但是,如果您真的想这样做,您可以在它们各自的设备断开连接后立即删除它们
关于实例的创建,您可以使用相同的方法。您可以在用户请求时(1)或在连接新的监视设备时(2)实例化新对象。如果可以将监控设备连接到系统,但在应用程序上下文中不使用它,我将使用(1)。另一方面,如果每次新的监控设备连接到系统时,比如说,您的应用程序需要获得设备的分辨率,我会选择(2)。无论采用哪种方式,都要保持一致,并明确说明它们应该做什么 监视器的数量有变化吗 如果不是,我会说你最好保留一个版本并保持所有权。不要让或让用户破坏它们 如果是,请返回共享/自动指针或可复制的内容。我怀疑后者是正确的选择,除非创建和销毁对内部的引用非常昂贵。不过,这只是推测 main中的Init/Cleanup函数既不美观也不优雅,但它们非常有效,可以非常直接地传达您的意图 另一个(在我看来,更好)选择是根本不返回对象。只需使用监视器索引公开静态函数:
size_t GetNumMonitors();
void GetMonitorSize(size_t idx, int &x, int &y);
void SetMonitorSize(size_t idx, int x, int y);
如果您确实想要对象设计,请将其隐藏在此(或类似)界面后面。这将使用户从处理您的实现中解放出来
我是否应该采取不同的方法,允许用户创建他/她想要的尽可能多的监视器实例?这似乎是错误的,因为这就好像他们将创建一个物理监视器,而我的方法允许访问已经可用的共享资源
是的,你绝对应该。有几个原因:
- 您给用户的是监视器的抽象,而不是真正的物理监视器。因此,监视器对象的数量与实际物理监视器的数量不一定是错误的
- 不同的用户可能有不同数量的监视器
- 人们可能有“虚拟”监视器,或者可能有用于测试的模拟实现,它们从来都不与物理监视器对应
- 单身人士是
您应该试着看看是否可以重新设计一些东西,以便可以在代码中传递此监视器实例(类似于依赖项注入),而不是将其作为单例(实际上是OO中最滥用的模式)来执行。针对单例的可怕性,我知道这是普遍的共识,但我认为当他们提供共享资源时,他们是可以接受的。用户可能有不同数量的监视器是什么意思?监视器对象是在运行时动态创建的,如果请求第三个监视器,并且只插入了2个监视器,则会引发异常。自从上次的评论以来,您让我意识到我过于复杂了!我只允许用户创建监视器的实例。这种方法更好吗?我可以这么说,是的。它对您来说更简单,对代码的用户来说更容易理解,而且它也更灵活和强大。为什么要人为地限制可以创建的实例的数量呢?如果用户只需要一个实例,他只需要创建一个实例。我想我会使用Jalf,只需要忘记单例,将它变成一个可以创建的对象。谢谢你的建议。现在要了解如何将监视器拔出事件挂接到我的代码。。。在linux中:P祝我好运;)再次感谢。