Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.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++_Oop_Singleton - Fatal编程技术网

C++ 跨平台代码组织

C++ 跨平台代码组织,c++,oop,singleton,C++,Oop,Singleton,我有一个monitor类,它通过一个静态函数访问自身的实例。调用GetMonitor时,将搜索Commonitors映射并返回实例,如果实例不存在,则创建实例 class Monitor { public: static Monitor& GetPrimaryMonitor(); static Monitor& GetMonitor(int number = 0); int GetXResolution();

我有一个monitor类,它通过一个静态函数访问自身的实例。调用GetMonitor时,将搜索Commonitors映射并返回实例,如果实例不存在,则创建实例

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);
如果您确实想要对象设计,请将其隐藏在此(或类似)界面后面。这将使用户从处理您的实现中解放出来

我是否应该采取不同的方法,允许用户创建他/她想要的尽可能多的监视器实例?这似乎是错误的,因为这就好像他们将创建一个物理监视器,而我的方法允许访问已经可用的共享资源

是的,你绝对应该。有几个原因:

  • 您给用户的是监视器的抽象,而不是真正的物理监视器。因此,监视器对象的数量与实际物理监视器的数量不一定是错误的
  • 不同的用户可能有不同数量的监视器
  • 人们可能有“虚拟”监视器,或者可能有用于测试的模拟实现,它们从来都不与物理监视器对应
  • 单身人士是

我建议远离单例,特别是如果它们是用静态实现的。这种模式的含义起初并不明显,但以后可能会变得复杂(例如,如果您有多个二进制文件、DLL、关心特定的销毁顺序等)


您应该试着看看是否可以重新设计一些东西,以便可以在代码中传递此监视器实例(类似于依赖项注入),而不是将其作为单例(实际上是OO中最滥用的模式)来执行。

针对单例的可怕性,我知道这是普遍的共识,但我认为当他们提供共享资源时,他们是可以接受的。用户可能有不同数量的监视器是什么意思?监视器对象是在运行时动态创建的,如果请求第三个监视器,并且只插入了2个监视器,则会引发异常。自从上次的评论以来,您让我意识到我过于复杂了!我只允许用户创建监视器的实例。这种方法更好吗?我可以这么说,是的。它对您来说更简单,对代码的用户来说更容易理解,而且它也更灵活和强大。为什么要人为地限制可以创建的实例的数量呢?如果用户只需要一个实例,他只需要创建一个实例。我想我会使用Jalf,只需要忘记单例,将它变成一个可以创建的对象。谢谢你的建议。现在要了解如何将监视器拔出事件挂接到我的代码。。。在linux中:P祝我好运;)再次感谢。