대부분의 객체에 다른 객체에 대한 포인터가 있지만 객체를 소유하지 않은 객체 계층 구조에 대한 직렬화 해제 시나리오가 있습니다.컴파일시 포인터 유형에 대한 포인터 적용
- 객체가 생성됩니다,의 ID에
Register(Object* pObject)
에드는, 데이터를 읽어 : 내가하는 두 단계의 프로세스를 구현하기 위해 노력하고 있습니다. 포인터 멤버는 고유 한 ID로 일련 번호가 지정되므로 다시 읽으면 IRegisterResolver(int id, Object** ppMember)
가 반환됩니다. - 리졸버가 처리됩니다. ID가 조회되고 올바른 주소가
*ppMember
인 주소에 쓰여집니다 (역 참조에주의하십시오).
문제는 :
- 내가 등록 할 특정
Base
클래스 또는 파생 된 개체 만 포인터를 시행 할, 그러나Derived**
는Base**
로 변환 할 수 없습니다. - 나는
void*
(안void**
)Derived**
/Base**
이 될 수 있음을 모두가 변환 사용하는 경우 모호성을 피하기 적어도 원하는,하지만 그렇게 할 수Derived*
/Base*
. 다음 시나리오에서
: 인터페이스가 RegisterResolver(int id, void* ppObject)
경우
struct A: public Serialized
{
int blah;
};
struct B: public Serialized
{
float fBlah;
A* pTarget;
};
B myB;
는 클라이언트 코드가 myB.pTarget
대신 &myB.pTarget
의 통과하지 않는다고 보장 할 수 없습니다.
이 솔루션의 [유형] 안전성과 가독성을 개선하려면 어떻게해야합니까?
(대상 플랫폼은 x86 및 ARM 임)