2014-09-28 129 views
-6

每当一个对象从一个类实例化时,我需要捕获它的对象ID。有没有任何助推电话可以帮助捕捉这些信息?在C++中获取对象ID

Class1 obj1(); 
Class2 obj2(); 

我想知道这些对象是如何存储的,以及是否存在与其关联的ID?

编辑: 这样做的目的是要知道当对象被创建和销毁时跟踪对象。有多少人在场,是否所有人都能正常销毁。

+7

C++中没有内置对象ID。而你的“对象”实际上是函数声明。 – juanchopanza 2014-09-28 13:13:00

+0

“对象ID”是什么意思? – 5gon12eder 2014-09-28 13:14:26

+0

你应该编辑你的问题来解释*为什么*你需要这样的对象id! – 2014-09-28 13:46:08

回答

2

如果您需要独特的对象ID,您应该自己关心这个ID。例如,你可以决定你的所有对象继承从超像

class ObjectWithId { 
    uint64_t _id; 
    static uint64_t _counter_; 
protected: 
    ObjectWithId() : _id(++_counter_) {}; 
/// etc.... 
}; 

不过你要小心,想想ID应该有一个副本,或者一动,等...顺便说一句,上面的类是而不是线程安全。你可能想原子计数器(例如使用std::atomic),等等等等......

阅读rule of three/rule of five等等...

通过πάντα ῥεῖ你可能有时需要persistent ID作为评论。他们可以通过一些外部手段来提供(例如,在数据库中插入新内容,然后在每个C++对象构造中使用该数据库提供的ID),或者可以使用诸如UUID之类的东西,或者生成一个随机字符串等。也关心最终重用被毁坏物体的身份。

你也可能只想要非唯一的(但经常是不同的)id,例如,如果你只是用它们进行哈希码计算。在实践中,你可能只想使用一些快速的PRNG(或许只是lrand48)来获得它们。

注意,标准C++ 11 containers不需要任何独特ID:他们经常要在包含类的一些排序(如std::set),或者仅仅是一个散列码 - 有可能是一个平等的测试 - (例如std::unordered_map ),并且它们总是给出可能性(通过可选的模板参数)以明确地给出比较和/或散列函数。

顺便说一句,寻找memory leaks的好工具是valgrind(或一些专有的等价物)。您可能应该详细了解smart pointers和C++标准<memory>标题。

+0

如果该对象实例表示某些东西,应该跨越进程边界使用此解决方案将无济于事。至少应该提到例如数据库引擎或UUID机制也提供_Object-ID_'s。 – 2014-09-28 13:29:28

+0

@πάνταῥεῖ:谢谢,我改进了我的答案。 – 2014-09-28 13:47:42