我有一个与用户交互的GUI,但是与此相关的是OOP设计问题。

用户通过对话框指定CDiscreteDistribution,并将它们存储在std::vector<CDiscreteDistribution*>类的MyAppDoc中进行序列化。用户通过另一个对话框为特定的CDistribution选择CParameter的类型。 CDiscreteDistributionCConstantDistributionCContinuousDistribution继承CDistribution,并且CParameter具有指向CDistribution成员变量的多态指针。 MyAppDoc的容器类为CParameter。因此,CDiscreteDistribution被指向两次两次,但仅存在一次。

总而言之,MyAppDoc具有


std::vector<CDiscreteDistribution*>
CContainer有很多CParameter

CDistribution*可以指向以下其中一个

CDiscreteDistribution是上面存储的CDiscreteDistribution*之一
CConstantDistributionCParameter创建/销毁
CContinuousDistributionCParameter创建/销毁




由于双重删除和序列化(增强),这种设计模式使我在移植应用程序以使用shared_ptr时遇到了许多噩梦。 CDiscreteDistribution的指针之一应该是weak_ptr吗?如果是这样,应该在哪里拥有指针?

谢谢你的帮助!



编辑:
我重新考虑了使用std::vector<CDiscreteDistribution*>的理由,这只是为了避免将向量复制到GUI中或从GUI中复制出来。但是对象很小,因此我断开了它们之间的链接,并承受了较小的性能影响。现在MyAppDoc具有:


std::vector<CDiscreteDistribution>
CContainer有很多CParameter

CDistribution*可以指向以下其中一个

CDiscreteDistribution创建/销毁的CParameter,从上面存储的CDiscreteDistribution之一复制
CConstantDistributionCParameter创建/销毁
CContinuousDistributionCParameter创建/销毁




我认为问题的一部分是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/

10-13 01:52