跨平台代码组织

时间:2011-08-24 16:54:38

标签: c++ oop singleton

我有这个监控类,可以通过静态函数访问自身实例。调用GetMonitor时,将搜索mMonitors映射并返回实例,如果该实例不存在,则会创建该实例。

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;
};

我的问题是,我什么时候应该删除地图中保存的Monitor实例?或者我应该采取不同的方法允许用户创建他/她想要的监视器实例?这似乎是错误的,因为它就好像他们会创建一个物理监视器,而我的方法可以访问已经可用的共享资源。先谢谢你,

4 个答案:

答案 0 :(得分:1)

  

我应该采取不同的方法允许用户创建他/她想要的监视器实例吗?这似乎是错误的,因为它会像创建物理监视器一样,而我的方法可以访问已经可用的共享资源

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

  • 您正在为用户提供监视器的抽象,而不是真正的物理监视器。因此,拥有与实际物理监视器不同数量的Monitor对象并不一定是错误的。
  • 不同的用户可能拥有不同数量的监视器
  • 人们可能拥有“虚拟”监视器,或者可能是用于测试的模拟实现,它们根本不会与物理监视器相对应。
  • 单身人士just a plain horrible idea

答案 1 :(得分:1)

我建议远离单身人士,特别是如果他们用静力学来实施的话。这种模式的含义一开始并不明显,但可能会使事情变得复杂(例如,如果你有多个二进制文件,DLL,关心特定的破坏顺序等)。

你应该试着看看你是否可以重新设计东西,以便可以在代码中传递这个Monitor实例(依赖注入的类型),而不是将它作为单例(OO中最滥用的模式)来实现。

答案 2 :(得分:0)

您不需要删除监视器的实例(考虑到您不会将那么多监视器设备连接到您的系统,这不会有问题)。但是如果你真的想这样做,你可以在他们各自的设备断开连接后立即删除它们。

关于实例的创建,您可以保持相同的方法。您可以在用户请求时(1)或连接新的监视器设备时实例化新对象(2)。如果可以将监视器设备连接到系统但在应用程序的上下文中不执行任何操作,我将使用(1)。另一方面,如果每次将新的监视器设备连接到系统时,您的应用程序需要获得设备的分辨率,我会选择(2)。

答案 3 :(得分:0)

无论哪种方式,都要保持一致和明显的应该做的事情。

监视器的数量是否会发生变化?

如果没有,我会说你最好保留一个版本并保持所有权。不要让或让用户销毁它们。

如果是这样,请返回共享/自动指针或可复制的内容。我怀疑后者是正确的选择,除非创建和销毁你对内部的引用是非常昂贵的。这是推测性的。

主要的初始/清理功能并不美观或优雅,但它们非常有效,可以非常直接地传达您的意图。

另一个(在我看来,更好)选项是根本不返回对象。只需使用监视器索引公开静态函数:

size_t GetNumMonitors();
void GetMonitorSize(size_t idx, int &x, int &y);
void SetMonitorSize(size_t idx, int x, int y);

如果您真的想要对象设计,请将其隐藏在此(或类似)界面后面。这使用户无需处理您的实现。