Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.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
生成类唯一id的有效方法? < C++中是否有一种有效的方法生成类唯一的ID,而不是实例?我正在寻找这种简单程度的东西(这会为每个实例生成一个ID,而不是为每个类类型生成一个ID):_C++_Algorithm_Performance - Fatal编程技术网

生成类唯一id的有效方法? < C++中是否有一种有效的方法生成类唯一的ID,而不是实例?我正在寻找这种简单程度的东西(这会为每个实例生成一个ID,而不是为每个类类型生成一个ID):

生成类唯一id的有效方法? < C++中是否有一种有效的方法生成类唯一的ID,而不是实例?我正在寻找这种简单程度的东西(这会为每个实例生成一个ID,而不是为每个类类型生成一个ID):,c++,algorithm,performance,C++,Algorithm,Performance,编辑:为什么我需要唯一ID 我在写一个游戏。我的游戏中的所有实体都有不同的状态(向左走、跳跃、站立等);这些状态在类中定义。每个州都需要有自己的ID,这样我才能识别它 将您的MyClass用作原语,并将一个静态实例合并到您想要标识的每个类中 class MyOtherClass1 { static MyClass id; }; class MyOtherClass2 { static MyClass id; }; [etc.] 你可以试试这个,但它不是决定性的 int id

编辑:为什么我需要唯一ID


我在写一个游戏。我的游戏中的所有实体都有不同的状态(向左走、跳跃、站立等);这些状态在类中定义。每个州都需要有自己的ID,这样我才能识别它

将您的
MyClass
用作原语,并将一个静态实例合并到您想要标识的每个类中

class MyOtherClass1 {
    static MyClass id;
};

class MyOtherClass2 {
    static MyClass id;
};

[etc.]

你可以试试这个,但它不是决定性的

int id_count = 0;

template <typename T>
int get_id()
{
    static int id = id_count++;
    return id;
}
int id\u count=0;
模板
int get_id()
{
静态int id=id_count++;
返回id;
}
然后使用:

get_id<int>(); // etc.
get_id();//等
当然,这不是线程安全的


同样,它不是确定性的:ID是在您第一次为每种类型调用函数时生成的。因此,如果在一次运行中调用
get\u id()
before
get\u id()
,那么在另一次运行中,您以相反的方式调用它们,那么它们将具有不同的id。但是,在一次运行中,它们对于每种类型都是唯一的。

基本上,您要求的是定制的滚动RTTI解决方案,可以有选择地应用于类

这可以从非常粗糙的预处理器开始,比如:

#define DECLARE_RTTI_CLASS(a) class a {  \
     inline const char * class_id() { return #a };
。。到一个更复杂的解决方案,跟踪继承等,基本上部分复制编译器RTTI功能。例如,请参见游戏编程宝石2


之前关于gamedev的讨论也是

我知道这一点,但我一直在寻找更“自动”的东西。像这样用手做容易出错@Paul:除非你使用像OpenC++这样的工具(它还有维护吗),否则你不能要求编译器自动充实所有的类实例:它们只包含每个类实例中明确列出的内容。但是,如果你的程序依赖于这些字段,那么如果它们不存在,你应该会得到编译时错误,这就留下了你的神秘脚本语言,这是你还没有提供的细节(它非常荒谬,它允许你从C++类中派生…).@Tony语言是Python。@Paul:谢谢你告诉我-我目前的团队使用Python很多,但不是嵌入式的-打开了可能性:-)
typeid
type\u info
,虽然这些通常只考虑用于调试目的,所以我只使用枚举或字符串标识符。你想要完成什么,需要你有一个类型ID列表,因为可能有更好的方法。。。C++是强类型的,所以所有类型都有固有的唯一性。在生产代码中使用<代码> Type ID >代码是不是坏的做法?这似乎是我现在最好做的事情。我认为这是生产代码中的糟糕做法。首先是因为它是一个运行时构造,不能保证为
.name
返回任何人类可读的内容,其次是因为C++0x引入了
decltype
auto
,这将缓解模板代码中的一些类型检查需求,而模板代码可能是您应该考虑的唯一位置这是一个很好的解决方案,因为我的应用程序不是多线程的。问题是我不能在编译时知道所有类型。编译时只知道基类,派生类将在脚本中定义。我需要每个派生类都有一个唯一的ID。@Paul:如果类型来自脚本,那么您将需要一个特定于您所使用的脚本语言的解决方案。我希望有一种巧妙的方法来使用静态变量,从而允许基类(在编译时已知)“为每个派生类派生唯一的ID。”保罗:就代码的C++部分而言,没有人从您的类派生。你不关心C++;解决问题的方法取决于脚本语言,以及它如何与现有C++代码进行接口。
#define DECLARE_RTTI_CLASS(a) class a {  \
     inline const char * class_id() { return #a };