我有一个对象层次结构的反序列化方案,其中大多数对象包含指向其他对象的指针,但不拥有它们。
我正在尝试实施一个两步过程,其中:
- 创建对象,
Register(Object* pObject)
编辑一个 ID,读取数据。指针成员被序列化为唯一 ID,因此在读回它们时,IRegisterResolver(int id, Object** ppMember)
s. - 处理解析器:查找 ID 并将正确的地址写入该地址
*ppMember
(注意取消引用)。
问题:
- 我想强制只
Base
注册指向某个类的对象或派生自某个类的指针,但Derived**
不能将其转换为Base**
. - 我想至少在使用
void*
(notvoid**
) 时避免歧义,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。)