C++ C++;-在哪里存储全局计数器?

C++ C++;-在哪里存储全局计数器?,c++,C++,这是我一直在开发的一个应用程序的最简UML图。它应该模拟与不同测量相关的一组传感器的管理。 请忽略House类,该图表已过时 然而,我有麻烦。每个传感器(声音、触点、热量、压力、气体-所有这些都继承自传感器)都有一个唯一的ID,从第一个传感器的0开始,到传感器总数-1结束 出于良好实践的考虑,我应该在哪里存储传感器的总数,以便我用于文件输入/输出(保存和加载)和插入新传感器的类可以访问并增加计数器 谢谢你抽出时间 查看假设您不想使用某种数据库。查看假设您不想使用某种数据库。创建传感器的任何对象都

这是我一直在开发的一个应用程序的最简UML图。它应该模拟与不同测量相关的一组传感器的管理。 请忽略
House
类,该图表已过时

然而,我有麻烦。每个传感器(声音、触点、热量、压力、气体-所有这些都继承自
传感器
)都有一个唯一的ID,从第一个传感器的0开始,到传感器总数-1结束

出于良好实践的考虑,我应该在哪里存储传感器的总数,以便我用于文件输入/输出(保存和加载)和插入新传感器的类可以访问并增加计数器


谢谢你抽出时间

查看假设您不想使用某种数据库。查看假设您不想使用某种数据库。创建传感器的任何对象都应将标识符分配给传感器


如果多个对象创建传感器,则应在创建传感器时为其分配指向标识符提供程序的指针或引用,并在创建新传感器对象时向该提供程序查询新的唯一标识符。

创建传感器的任何对象都应将标识符分配给传感器


如果多个对象创建传感器,则应在创建传感器时为其分配一个指向标识符提供程序的指针或引用,并在创建新传感器对象时向该提供程序查询新的唯一标识符。

您的唯一ID(如数据库表ID)可能会出现一些问题

最终,您可能会发现您的ID需要在会话之间保持不变——您的窗口ID用于其他关系

有朝一日,您可能还会发现它在多个服务器/客户机集之间需要是唯一的

我只是建议你应该立即考虑这些问题。


至于应该在哪里生成ID,因为您的所有“传感器”类都继承自一个基类,所以我认为我应该通过该基类中的线程安全方法生成它——我也会将它存储在那里。

您的唯一ID(如数据库表ID)可能会有一些问题

最终,您可能会发现您的ID需要在会话之间保持不变——您的窗口ID用于其他关系

有朝一日,您可能还会发现它在多个服务器/客户机集之间需要是唯一的

我只是建议你应该立即考虑这些问题。


至于应该在哪里生成ID,因为您的所有“传感器”类都继承自一个基类,所以我想我应该通过该基类中的线程安全方法生成它——并且我还将它存储在那里。

有什么问题吗?您是否使用矢量存储传感器?定义在房屋中放置传感器对象的向量

可以访问并递增该计数器吗


你不必这么做,向量会帮你做的

有什么问题吗?您是否使用矢量存储传感器?定义在房屋中放置传感器对象的向量

可以访问并递增该计数器吗


您不必这样做,Vector会为您执行此操作。一个选项是在Sensor类中创建一个静态函数,该函数递增并返回一个静态计数器变量。传感器的构造函数可以调用此函数以获取ID

// header file
class Sensor
{
...
protected:
   static int getId() { return id++; }
private:
   static int id;
   int myId;
};

// .cpp file
int Sensor::id = 0;

Sensor::Sensor(...)
: myId(getId())
  ...
{}

我忽略了线程和持久性问题。但希望这能给您一个更好的主意。

一个选项是在Sensor类中创建一个静态函数,该函数递增并返回一个静态计数器变量。传感器的构造函数可以调用此函数以获取ID

// header file
class Sensor
{
...
protected:
   static int getId() { return id++; }
private:
   static int id;
   int myId;
};

// .cpp file
int Sensor::id = 0;

Sensor::Sensor(...)
: myId(getId())
  ...
{}

我忽略了线程和持久性问题。但希望这能给你一个更好的主意。

仅仅是一个全球性的问题是什么?为什么要将任何内容限制为单个实例?据我所知,OP想要一个对象,可以作为发放id号的权限。拥有一个以上的授权实例会产生问题并违反要求,它将不再是唯一的id号。仅仅是一个全局授权有什么问题?为什么要将任何内容限制为单个实例?据我所知,OP想要一个对象,可以作为发放id号的权限。拥有该权限的多个实例将产生问题并违反要求,并且不再是唯一的id号。明白。非常感谢。我应该在哪里定义“标识符提供者”?@Francisco:提供标识符的任何东西都必须跟踪它分配了多少标识符,并且应该知道它分配了多少标识符。我看不出有任何理由在这个场景中使用全局或单例。非常感谢。我应该在哪里定义“标识符提供者”?@Francisco:提供标识符的任何东西都必须跟踪它分配了多少标识符,并且应该知道它分配了多少标识符。我看不出有任何理由在这种情况下使用全局或单例。如果您有时间,请提供更多详细信息。我应该如何定义它,等等。!谢谢。如果您有时间,请提供更多详细信息。我应该如何定义它,等等。!谢谢,不!不要定义
std::list
!那是万不得已的办法。使用
std::vector
std::deque
,只有当它们不满足您的需要时,您才应该查看
std::list
。好的,我说的是“一般”不!不要定义
std::list
!那是万不得已的办法。使用
std::vector
std::deque
,只有当它们不满足您的需要时,您才应该查看
std::list
。好的,我说的是“一般性”的。这个变量会被定义为类的一个属性吗?@Francisco-我添加了一些代码,让它更清楚我的意思。谢谢!如果我