在B不知道A的情况下,创建类B中的类A拥有的对象

时间:2018-07-18 12:06:16

标签: c++ oop design-patterns

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

可能的解决方案:

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

以某种方式,我感到这两种方法都是不好的,并且B类不应真正创建它不拥有的对象。在这种情况下是否有一些设计模式会有所帮助?我当时在考虑一些工厂,但这只是为问题添加代理,我并不认为这样做会有很大帮助。或者,也许我应该完全摆脱B类,并掌握A中的所有逻辑?但是,这里的问题是我不希望A做太多。

2 个答案:

答案 0 :(得分:0)

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

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 */ });
}

答案 1 :(得分:0)

只要您明确说明了从类B创建并转移到类A的Foo对象的所有权,就可以使用您的1.解决方案了,因为删除将在A中进行。

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

与您的2.解决方案相比,它具有强大的优势:  -与A的内部映射不存在耦合关系>返回类型在A或B中可以独立变化,从而使您将来可以在另一个C类中使用相同的类型,从而可以将Foo对象保存在vector<Foo>