我正在为C++对象图实现一个“克隆”函数,其中一部分问题是确保如果有两个指针指向同一对象,则不会对其进行两次克隆。我通过保留
这种方案的问题在于,如果一个对象以不同的类型(例如接口与具体类型)在两个位置引用,那么对
我在网上寻找现有的解决方案,并意识到Boost.Serialization也必须处理相同的问题。但是在浏览了它的源代码后,我无法找到实际跟踪对象指针的部分。
有人能够提出一个有效的设计建议吗?或者指出Boost代码中执行此操作的部分吗?
map<void*, void*>
来实现这一点,将原始对象作为键,克隆版本作为值。在克隆对象时,我使用模板函数检查对象是否在映射中 - 如果是,则返回它以static_cast<T*>
的形式,否则,我会克隆它并将原始和克隆保存在映射中,并进行隐式转换为void*
。这种方案的问题在于,如果一个对象以不同的类型(例如接口与具体类型)在两个位置引用,那么对
void*
的转换可能不会产生相同的值。这意味着该对象将被克隆两次。我在网上寻找现有的解决方案,并意识到Boost.Serialization也必须处理相同的问题。但是在浏览了它的源代码后,我无法找到实际跟踪对象指针的部分。
有人能够提出一个有效的设计建议吗?或者指出Boost代码中执行此操作的部分吗?
dynamic_cast<void*>
吗? - Björn Pollexvoid*
,而在于dynamic_cast
只能用于多态类型。 :/ - Xeo