【问题标题】:Is there something equivalent to `instancetype` in C++?C++ 中是否有与“instancetype”等价的东西?
【发布时间】:2014-05-03 20:26:16
【问题描述】:

我有一个基类 Base 派生自 A。

我想写这样的东西

Base *unsafeRelease() {
    --_refCount;
    return this;
}

... 这样我就可以在 Base 子类的实例上调用 unsafeRelease。

在我看来,问题是在所有预期情况下使用此代码将涉及向上转换和向下转换。我想以某种方式指定我将返回一个指向Base 子类实例的指针。这可能吗?

【问题讨论】:

  • 请看std::enable_shared_from_this和virtual。
  • 我认为在这种情况下我不想要shared_ptr。这一切都在具有 C 包装器的 C++ 库中。 virtual 看起来确实是正确的方向。我不需要重写每个子类吗? stackoverflow.com/questions/4665117/…
  • 您需要一个虚拟析构函数来正确销毁,否则只需覆盖您必须要做的。为什么你认为你不应该使用shared_ptr?关于您的字面问题:typeid 为您提供对象的实例类型,该对象类型以至少一个虚函数的类型给出。也可用于类类型本身。
  • @Deduplicator:也许是这样,如果delete 用于基类类型的某处。但不仅仅是因为这里显示的代码。
  • @Deduplicator: shared_ptr 不能跨库边界使用,听起来他有。

标签: c++ pointers inheritance


【解决方案1】:

从std::enable_shared_from_this 派生您的Base 并使用make_shared 分配您的对象。
一个好的库的开销是2*sizeof(size_t)+sizeof(std::shared_ptr),没有额外的分配。

这允许您将原始指针作为不透明句柄分发,并且仍然恢复 shared_ptr,并且它有效地处理了使用匹配释放函数的要求。

然后,您可以在任何需要的地方使用shared_ptr 或weak_ptr。

另一种方法是在Base 中定义引用计数、函数Release、AddRef 和虚拟析构函数,手动管理引用计数(看看IUnknown,所有COM 类的基本接口. 考虑让你的类从你的平台实现派生出来)。

关于instancetype:typeid 运算符是您想要的。您只需要至少一个虚函数就可以工作(在这种情况下,析构函数也应该是虚函数,几乎在所有情况下)。

【讨论】:

  • 我不知道这个 (`enable_shared_from_this) 是否会起作用,所以我还不能接受。我得试一试,这可能需要一点时间。
  • 不急。如果还有什么问题,我再看看。
  • 我目前(已经)使用参考计数方法。它让我想到了这个问题。
  • 我不确定这是否可以在没有更多转换的情况下完成。在 C 中可见的 typedef 需要是 void * 或类似会混淆共享指针的释放的模棱两可的东西。
  • 为什么?给他们标准的不透明指针习语:typedef struct Base Base; 就像为 FILE 所做的一样。
猜你喜欢
  • 2022-01-10
  • 2018-05-26
  • 2014-10-14
  • 2012-12-30
  • 2020-07-21
  • 2011-09-25
  • 2023-03-07
  • 1970-01-01
  • 2017-07-27
相关资源
最近更新 更多