我有一个与用户交互的GUI,但是与此相关的是OOP设计问题。
用户通过对话框指定CDiscreteDistribution
,并将它们存储在std::vector<CDiscreteDistribution*>
类的MyAppDoc
中进行序列化。用户通过另一个对话框为特定的CDistribution
选择CParameter
的类型。 CDiscreteDistribution
,CConstantDistribution
和CContinuousDistribution
继承CDistribution
,并且CParameter
具有指向CDistribution
成员变量的多态指针。 MyAppDoc
的容器类为CParameter
。因此,CDiscreteDistribution
被指向两次两次,但仅存在一次。
总而言之,MyAppDoc
具有std::vector<CDiscreteDistribution*>
CContainer
有很多CParameter
有CDistribution*
可以指向以下其中一个CDiscreteDistribution
是上面存储的CDiscreteDistribution*
之一CConstantDistribution
由CParameter
创建/销毁CContinuousDistribution
由CParameter
创建/销毁
由于双重删除和序列化(增强),这种设计模式使我在移植应用程序以使用shared_ptr
时遇到了许多噩梦。 CDiscreteDistribution
的指针之一应该是weak_ptr
吗?如果是这样,应该在哪里拥有指针?
谢谢你的帮助!
编辑:
我重新考虑了使用std::vector<CDiscreteDistribution*>
的理由,这只是为了避免将向量复制到GUI中或从GUI中复制出来。但是对象很小,因此我断开了它们之间的链接,并承受了较小的性能影响。现在MyAppDoc
具有:std::vector<CDiscreteDistribution>
CContainer
有很多CParameter
有CDistribution*
可以指向以下其中一个
由CDiscreteDistribution
创建/销毁的CParameter
,从上面存储的CDiscreteDistribution
之一复制CConstantDistribution
由CParameter
创建/销毁CContinuousDistribution
由CParameter
创建/销毁
我认为问题的一部分是boost::serialization
为每个shared_ptr
设置了两个CDiscreteDistribution
,它们彼此都不知道对方的存在。现在唯一的问题是向后兼容以前版本创建的文件。
我认为这个“解决方案”实际上只是在避免适当的设计!
最佳答案
问题描述得不足以理解全部情况,复杂性和确切问题,但总的来说-
我假设您要使用shared_ptr不必手动删除()对象
如果是这样,请查看是否可以通过不使用shared_ptr而不是使用boost :: ptr_vector而不是原始指针的矢量来解决它;然后ptr_vector将为您处理内存管理。
我什至不确定shared_ptr会为您带来什么-很明显,出于对情况的有限了解,我会说Doc拥有CDiscreteDistribution对象。拥有其他两种类型的发行版的人负责删除它们;这可以通过shared_ptr或其他方式完成。 (您说的是“本地实例化”,但这并不意味着太多-它们是在堆还是堆栈上实例化?它们的生存期是什么?为什么它们的生存期与DiscreteDistribution对象不同?什么是“本地”? )
关于c++ - OOP设计问题(MFC C++实现),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6783709/