0

我有一个对象层次结构的反序列化方案,其中大多数对象包含指向其他对象的指针,但不拥有它们。

我正在尝试实施一个两步过程,其中:

  1. 创建对象,Register(Object* pObject)编辑一个 ID,读取数据。指针成员被序列化为唯一 ID,因此在读回它们时,I RegisterResolver(int id, Object** ppMember)s.
  2. 处理解析器:查找 ID 并将正确的地址写入该地址*ppMember(注意取消引用)。

问题:

  • 我想强制只Base注册指向某个类的对象或派生自某个类的指针,但Derived**不能将其转换为Base**.
  • 我想至少在使用void*(not void**) 时避免歧义,Derived**/Base**都可以转换为,但是Derived*/也可以Base*

在以下场景中:

struct A: public Serialized
{
  int blah;
};

struct B: public Serialized
{
  float fBlah;
  A*    pTarget;
};

B myB;

如果接口是RegisterResolver(int id, void* ppObject),则不能保证客户端代码不会通过myB.pTarget而不是&myB.pTarget.

我可以做些什么来提高此解决方案的 [type-] 安全性和可读性?

(目标平台是 x86 和 ARM。)

4

2 回答 2

1

模板应该会有所帮助。怎么样

template<typename T>
void RegisterResolver(int id, T** ppObject, Base* extra = (T*)0);

这允许任何类型的参数,Derived**其中存在从Derived*to的隐式转换Base*

于 2013-04-15T00:20:12.697 回答
0

由于最初的问题也与可读性有关,并且我想尽量减少界面上可能令人困惑的参数,我已经迭代了Ben Voigt的答案并最终得到了这个:

template<typename T>
void RegisterResolver(int id, T** ppObject)
{
  // assert(ppObject != 0);
  Base* pBase(*ppObject); // not used

  // implementation
}
于 2013-04-16T11:56:39.997 回答