将数据添加到现有类,而无需继承、映射或修改类

Add data to an existing class without inheritance, maps or modification of the class

本文关键字:继承 映射 修改 添加 数据      更新时间:2023-10-16

类可以是任何东西(非pod,可能有虚函数)。

我们不能修改类的源代码。

  • 有一个对创建对象的工厂方法的控件
  • 在堆上重新分配的对象
  • 创建后不复制对象
  • 在编译时知道哪些类需要额外的数据

使用示例:

void f(ThirdPartyClass *o)
{
MyData *d = getData(o);
...
}

可能的解决方案是在构造ThirdPartyClass类型的对象时创建包装结构:

struct Wrapper
{
ThirdPartyClass o;
MyData d;
};

但是如何实现MyData* getData(ThirdPartyClass *o)功能呢?使用offsetof宏从ThirdPartyClass*获取到Wrapper*是不正确的。有办法吗?

我可能会使用"面向数据库"的过程。假设您已将包装器注册到向量中,您可以执行以下操作:

std::vector<Wrapper> containers;
MyData* getData(ThirdPartyClass *o) {
for(int i = 0; i < containers.size(); i++) {
if(&containers[i] == o)
return &containers[i].d;
}
}

也许另一种方法是将ThirdPartyClass *parent存储到您的MyData对象中,然后您可以迭代 MyData 的 vecotor。