【问题标题】:Getting object ID in c++ [closed]在 C++ 中获取对象 ID [关闭]
【发布时间】:2014-11-22 23:26:45
【问题描述】:

每当从一个类实例化一个对象时,我都需要捕获它的对象 ID。是否有任何可用的提升电话可以帮助捕获此信息?

Class1 obj1();
Class2 obj2();

我想知道这些对象是如何存储的,是否有与之关联的 ID?

编辑: 这样做的目的是知道对象何时被创建和销毁时跟踪对象。它们中有多少存在以及它们是否都被正确销毁。

【问题讨论】:

  • C++ 中没有内置对象 ID。而你的“对象”实际上是函数声明。
  • “对象 ID”是什么意思?
  • 你应该编辑你的问题来解释为什么你需要这样的对象ID!
  • @BasileStarynkevitch 请检查我的编辑..

标签: c++ visual-c++ boost


【解决方案1】:

如果您需要唯一的对象 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。

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

请注意,标准 C++11 containers 确实需要任何唯一的 id:它们通常需要对包含的类进行一些排序(例如 std::set),或者只是一个哈希码 - 使用可能是一个相等性测试 - (例如std::unordered_map),并且它们总是提供可能性(通过可选的模板参数)显式地给出比较和/或散列函数。

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

【讨论】:

  • 如果该对象实例代表某些东西,那么应该跨进程边界使用该解决方案不会有太大帮助。至少应该提到,例如数据库引擎或 UUID 机制也提供 Object-ID
  • @πάνταῥεῖ:谢谢,我改进了答案。
猜你喜欢
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多