J'ai un scénario de désérialisation pour une hiérarchie d'objets, dans lequel la plupart des objets contiennent des pointeurs vers d'autres objets, mais ne les possèdent pas.Application du pointeur au type de pointeur lors de la compilation
Je suis en train de mettre en œuvre un processus en deux étapes dans lequel:
- Les objets sont créés,
Register(Object* pObject)
ed à un ID, les données sont lues. Les membres de pointeur sont sérialisés en tant qu'ID uniques, donc en les relisant, jeRegisterResolver(int id, Object** ppMember)
s. - Les résolveurs sont traités: les ID sont recherchés et l'adresse correcte est écrite à l'adresse
*ppMember
(remarquez le déréférencement).
Le problème:
- Je veux faire valoir que seuls les pointeurs vers des objets ou issus d'une certaine classe
Base
être enregistré, maisDerived**
ne peut pas être converti enBase**
. - Je veux au moins éviter toute ambiguïté lors de l'utilisation
void*
(nonvoid**
) queDerived**
/Base**
peut être à la fois converti, mais alors si vousDerived*
/Base*
.
Dans le scénario suivant:
struct A: public Serialized
{
int blah;
};
struct B: public Serialized
{
float fBlah;
A* pTarget;
};
B myB;
Si l'interface est RegisterResolver(int id, void* ppObject)
, il n'y a aucune garantie que le code client ne passera pas myB.pTarget
au lieu de &myB.pTarget
.
Que puis-je faire pour améliorer la sécurité [de type] et la lisibilité de cette solution?
(Les plates-formes cibles sont x86 et ARM.)