gpt4 book ai didi

c++ - OOP设计题(MFC C++实现)

转载 作者:行者123 更新时间:2023-11-28 03:48:05 25 4
gpt4 key购买 nike

我有一个 GUI 来与用户交互,但我有一个 OOP 设计问题。

用户通过对话框指定CDiscreteDistribution s,它们存储在 std::vector<CDiscreteDistribution*> 中在MyAppDoc序列化类。通过另一个对话框,用户选择一种类型 CDistribution对于特定的 CParameter . CDiscreteDistribution , CConstantDistribution , 和 CContinuousDistribution继承CDistribution , 和 CParameter有一个指向 CDistribution 的多态指针成员变量。 MyAppDoc有一个容器类 CParameter .因此 CDiscreteDistribution s 被指向两次,但只存在一次。

总而言之,MyAppDoc

  1. std::vector<CDiscreteDistribution*>
  2. CContainer其中有很多CParameter其中有
    • CDistribution*它可以指向其中之一
      • CDiscreteDistribution这是 CDiscreteDistribution* 之一s 存储在上面
      • CConstantDistributionCParameter 创建/销毁
      • CContinuousDistributionCParameter 创建/销毁

这种设计模式让我在移植应用程序时做各种噩梦 shared_ptr由于双重删除和序列化(提升)。指针之一应该指向 CDiscreteDistribution成为weak_ptr ?如果是这样,应该在哪里拥有指针?

感谢您的帮助!


编辑:我重新考虑了 std::vector<CDiscreteDistribution*> 的原因这只是为了避免将 vector 复制到 GUI 中或从中复制出来。但是这些对象非常小,所以我打破了它们之间的联系并遭受了轻微的性能影响。现在MyAppDoc有:

  1. std::vector<CDiscreteDistribution>
  2. CContainer其中有很多CParameter其中有
    • CDistribution*它可以指向其中之一
      • CDiscreteDistributionCParameter 创建/销毁, 从 CDiscreteDistribution 之一复制s 存储在上面
      • CConstantDistributionCParameter 创建/销毁
      • CContinuousDistributionCParameter 创建/销毁

我认为部分问题是 boost::serialization做了两个shared_ptr每个CDiscreteDistribution并不知道彼此的存在。现在唯一的问题是向后兼容以前版本创建的文件。

我认为这个“解决方案”实际上只是在避免适当的设计!

最佳答案

问题的描述不足以了解全部情况、并发症和确切问题,但总的来说-

  • 我假设您想使用 shared_ptr 而不必手动 delete() 对象

  • 如果是这样,看看是否可以不使用 shared_ptr 而是使用 boost::ptr_vector 而不是原始指针 vector 来解决它;然后 ptr_vector 将为您处理内存管理。

我什至不确定 shared_ptr 会给你带来什么 - 从我对情况的有限理解来看,很明显,Doc 拥有 CDiscreteDistribution 对象。谁拥有其他两种类型的发行版,谁负责删除它们;这可以通过 shared_ptr 或其他方式完成。 (你说'本地实例化'但这并不意味着什么 - 它们是在堆还是堆栈上实例化?它们的生命周期是多少?为什么它们的生命周期与 DiscreteDistribution 对象不同?什么是'本地' - 什么是本地的? )

关于c++ - OOP设计题(MFC C++实现),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6783709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com