C++ 如何确保const int在C++;

C++ 如何确保const int在C++;,c++,enums,C++,Enums,我有一些容器,对象可以用它来存储一些数据。每个存储的对象都应该有自己的id,例如MY_GL_CONTEXT、Funcy_CONF_object等。我想存储这些分布在将使用它们的对象上的标识符。示例:类模型的对象希望使用id MY\u GL\u上下文存储这些数据 我想知道,我应该使用什么类型的ID来避免类之间的冲突。如果我使用static const int,那么可能会出现这样的情况:Object::MY\u GL\u CONTEXT将与Something::fully\u CONF\u Obje

我有一些容器,对象可以用它来存储一些数据。每个存储的对象都应该有自己的id,例如MY_GL_CONTEXT、Funcy_CONF_object等。我想存储这些分布在将使用它们的对象上的标识符。示例:类模型的对象希望使用id MY\u GL\u上下文存储这些数据

我想知道,我应该使用什么类型的ID来避免类之间的冲突。如果我使用static const int,那么可能会出现这样的情况:Object::MY\u GL\u CONTEXT将与Something::fully\u CONF\u Object具有相同的int值,因此在使用我的容器时,它们将合并


谢谢。

创建一个共享的
.h
文件,并在其中定义不同的值,这样就可以很容易地发现重复的值(只要保持顺序)。在需要的地方包括该文件

// To avoid duplication
#ifndef CONSTANTS   
#define CONSTANTS
#define MY_GL_CONTEXT 1
#define FUNNY_CONF_OBJECT 2
...
#endif

《C++》中有一些独特的东西。

每个对象都有一个唯一的地址。转换为
void*
,可以比较是否相等。不同的对象有不同的地址,所以这就形成了一个可用的id

每个多态类型都有自己的运行时类型信息,可通过
typeid
获得。这是通过
std::type_info::before
订购的


由于单独编译,实际上不可能保证
const int
值是唯一的。事实上,由于单独编译,可以同时编译两个.cpp文件。一个编译器如何知道另一个编译器将选择什么
int
值?

更好的是,将其设置为
enum
,这样您就不必单独给出数字,通过省略这些值,您还可以确保数字永远不相同。这是两种可能的备份计划之一(可能是Shahbaz所说的带有enum的版本)。但我认为标识符名称不应该是容器类定义的一部分。我希望有一个简单、简单和多功能的容器类,其他类可以使用它(使用它们自己的标识符)。第二个备份计划是容器的键(标识符)由两个元素组成->第一个是使用容器的对象的类型(根据我第一篇文章中给出的示例,对象或其他东西)kye的第二部分将是常量int或枚举标识符(例如Object::my_GL_Object或something::fully_CONF_Object)。此解决方案的问题是,它将使容器接口的声明复杂化,并且我将失去所需的简单性。如果您可以使用C++11,则可以使用强类型
enum
s。这样,您必须显式限定enum标识符,并且不能让它们与其他
enum
s的成员别名。是否执行这些值需要在不同的执行过程中保持一致(例如,它们是否已保存?),还是只需要在程序的单个实例中保持一致?我应该问的第一个问题是,为什么类之间不需要冲突。代码中是否存在需要区分
Something::funcy\u CONF\u OBJECT
OBJECT::MY\u GL\u CONTEXT
的情况?您可能需要区分在某些相关的常量之间(例如
MY\u GL\u CONTEXT
vs MY
MY\u DIRECT3D\u CONTEXT
),但在不相关的常量之间搁置(如果这样做,则可能存在设计问题)。MikeGM的问题非常重要。看起来您希望在容器中包含类型信息。如果仅在运行时需要对象,则检查类型的常规方法是在容器中存储指向动态分配对象的指针,并按动态\u cast进行检查。1.:定义基类
CData
。2.:定义cont
CData*
.3的输入:将ptr放入.4中派生类型的对象(例如
CDer*
):需要时,根据
动态转换(pObj)检查容器中的对象ptr pObj
。如果类型错误,您会得到pObj==0。thokra:我可以使用C++11,但我更喜欢在多个文件中定义标识符。MikeGM:我根本不需要那种持久值。我可能只在某种运行时缓存中使用它。因此,下次运行时,它将再次缓存。SJuan76:这些标识符将在一个容器类中使用。类将使用该容器,我希望防止同时使用该容器的多个类之间发生冲突。我考虑过这一点,得出了相同的结论。仍然感谢您的详细评论。我可以使用静态转换和模板(但我还不确定,我如何特别使用它)。