跨平台代码组织
Cross Platform Code Organisation
我有这个监视器类,它允许使用静态函数访问自身的实例。当调用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实例?还是应该采用另一种方法,允许用户创建他/她想要的任意数量的监视器实例?这似乎是错误的,因为这就好像他们将创建一个物理监视器,而我的方法提供了对已经可用的共享资源的访问。先谢谢你了
我是否应该采用另一种方法,允许用户创建他/她想要的任意多的监视器实例?这似乎是错误的,因为这就好像他们将创建一个物理监视器,而我的方法允许访问已经可用的共享资源
是的,你绝对应该。原因如下:
- 您正在向用户提供监视器的抽象,而不是真正的物理监视器。因此,拥有与实际物理监视器不同数量的监视器对象并不一定是错误的。
- 不同的用户可能有不同数量的监视器
- 人们可能有"虚拟"监视器,或者可能有模拟实现用于测试,它们根本不对应于物理监视器。
我建议远离单例,特别是如果它们是用静态实现的。这种模式的含义一开始并不明显,但可能会使事情变得复杂(例如,如果您有多个二进制文件,dll,关心特定的销毁顺序等)。
你应该试着看看你是否可以重新设计一些东西,以便这个Monitor实例可以在代码中传递(某种依赖注入),而不是作为一个单例(在OO中最被滥用的模式,真的)。
您不需要删除监视器的实例(考虑到您不会有那么多监视器设备连接到您的系统,这不会是一个问题)。但如果你真的想这样做,你可以在他们各自的设备断开连接后立即删除他们。
对于实例的创建,您可以使用相同的方法。您可以实例化一个新对象,当用户要求(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);
如果你真的想要对象设计,把它隐藏在这个(或类似的)接口后面。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 创建跨平台 C++ 触摸管理器.在 c++ 中传递 Objective-c 对象涉及代码
- 如何使用跨平台代码在C++中设置系统时间?
- 如何打包结构的成员以实现高效的跨平台代码
- Golang:在跨平台调用C++代码
- 在跨平台代码中使用抽象类的实例
- 使用.def或__declspec(dllexport)导出跨平台代码的共享库符号
- 具有本机代码支持的跨平台移动框架
- 跨平台C++代码和单头-多个实现
- 我试图想出一个跨平台的 sleep() 替代方案,但我的代码不太有效
- c++中的跨平台网络代码
- 跨平台代码标签宏
- 跨平台代码组织
- 为什么这样的理论上的跨平台代码不改变Windows上的Enviromental变量
- 在使用相同C++代码的跨平台窗体之间获取运行时错误