【问题标题】:Creating objects that are owned by class A in class B where B doesn't know of A在 B 不知道 A 的 B 类中创建属于 A 类的对象
【发布时间】:2018-07-18 12:06:15
【问题描述】:

我有一个关于设计的问题。有一个类 A 拥有 Foo 类型的对象映射。 A 的对象创建 Foo 对象并将它们存储在地图中,但是当某个指示出现时,我想在 B 类中做一些工作并在那里创建更多的 Foo 对象。 A 知道 B 并将任务委托给它,但反之则不然。在 B 中创建的 Foo 对象仍然需要进入 A 中的映射。

可能的解决方案:

  1. 将 shared_ptrs 的映射返回到从 B 中的方法创建的对象。
  2. 将映射从 A 传递给 B 中的方法作为非常量引用。

不知何故,我觉得这两种方法都很糟糕,B 类不应该真正创建它不拥有的对象。在这种情况下是否有一些设计模式会有所帮助?我在考虑一些工厂,但它只是为问题添加了一个代理,我真的认为它没有多大帮助。或者也许我应该完全摆脱 B 类并拥有 A 中的所有逻辑?然而,这里的问题是我不希望 A 做太多事情。

【问题讨论】:

  • 你能从 B 向量中返回创建的对象,然后将这些对象插入到 A 中的地图中吗?
  • 您能否提供更多信息,说明您要通过此设计解决的实际问题是什么?您的问题目前侧重于如何使特定设计工作,而不是解释您要完成的工作。如果不知道实际问题是什么,就很难提出更好的方法……

标签: c++ oop design-patterns


【解决方案1】:

您可以提供适当的处理程序,类似于以下内容:

class B
{
public:
    template <typename T>
    void execute(T newObjectHandler)
    {
        Foo* foo = new Foo();
        newObjectHandler(foo);
        executeTask(foo);
    }
};

void A::executeTask()
{
    myB->executeTask([this](Foo* foo) { /* insert into map */ });
}

【讨论】:

    【解决方案2】:

    只要明确说明从 B 类创建并转移到 A 类的 Foo 对象的所有权,我就可以选择您的 1. 解决方案,因为删除将发生在 A 中/从 A 中。

    合并两张地图应该没什么大不了的。

    与您的 2. 解决方案相比,它具有很强的优势: - 与 A 的内部映射没有耦合 > 返回类型可以在 A 或 B 中独立变化,允许您在未来使用另一个 C 类中的相同类型,它可以保存 Foo 对象,比如说 vector&lt;Foo&gt;

    【讨论】:

      猜你喜欢
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 2012-03-18
      相关资源
      最近更新 更多