在类中创建对象之前调用函数

时间:2015-11-30 15:30:10

标签: c++ design-patterns dependencies

基本上,我有一个拥有另一个对象的类:

class A()
{
    A() { initSystems() };
    void initSystems();
    B b;
}

class B()
{
    B() { //Does stuff that requires 'initSystems()' to be called before }
}

并且要使“B”运行,需要在A中调用init系统函数。有没有“好的”方法来解决这个问题?比如稍后创建'B'对象还是什么?

4 个答案:

答案 0 :(得分:4)

听起来你的课程太tightly coupled了。有很多方法可以解决这个问题,但这取决于你的其他设计。

也许A不应该拥有B,因为A是B的依赖关系。在实例化每个B时,你可以inject一个A的实例。

也许B不应该存在,而且它应该合并到A:

class A()
{
    A() {
        initSystems();
        //Does stuff that requires 'initSystems()' to be called before
    }
    void initSystems();
    // B's methods
}

我认为大多数初始化方法都是代码味道(也就是说,它表明设计不好)。有些人给这个模式起了一个名字:"Design Smell: Temporal Coupling"

答案 1 :(得分:3)

如果你想让B成为A的正式成员,你可以在构建hssfSheet.setAutoFilter(new CellRangeAddress(2, 4, 6, 3)); hssfSheet.setAutoFilter(new CellRangeAddress(8, 5, 3, 5)); 之前运行代码的两个地方是:

  1. A基类的构造函数,
  2. 在A成员的初始化列表中,对于在b上面声明的成员。
  3. 如果您希望推迟构建B,您需要通过间接保留对象或稍后将其构建到原始存储上,并在销毁时执行放置销毁。

    其中大部分都有奇怪的气味,重新组织代码以避免这种结构可能是有益的。

答案 2 :(得分:1)

您只需更改设计,因此initSystems()A都需要B

如果你不能这样做(尽管你真的应该这样做),还有其他方法,比如动态分配:

class A()
{
    A() { 
      initSystems(); 
      b = std::make_unique<B>();
    };
    void initSystems();
    std::unique_ptr<B> b;
}

答案 3 :(得分:0)

我同意@nanny对类的解耦和合并(如果可能的话)。

但是您的场景似乎是B在您的系统中是独立的实体,因此是一个类。 A 包含 B ,因此包含<。

因此解决这个问题的一种方法是,在A中保留B的引用(指针),而不是将B作为A的一部分。

或者你不应该在B的构造函数中访问在A的initInstance()中创建的东西,并在B中创建一个方法postConstruct,你可以在调用initInstance后从A调用它。以下代码解释了它,

class A()
{
    A()
    { 
        initSystems();
        b.postContruct()
    }
    void initSystems()
    {
        // do the init instance stuff here.
    }
    B b;
}

class B()
{
    B() {}

    void postContruct()
    { 
       //Does stuff that requires 'initSystems()' to be called before 
    }
}