另一个类问题中的C ++类对象

时间:2019-02-28 12:47:39

标签: c++ class

我在一个项目上工作,我有很多类,这些类具有其他类的实例作为字段。问题是我必须以特定的顺序声明类,以便编译代码。下面的示例:

class A{
  public:
    B* b; //unknown type name B
    A(){
      b = new B();
    }
};

class B{
  public:
    B(){
    }

};

上面的代码不起作用,因为它说B是未知的。 但是,如果我在A之前声明B类   一切正常。

class B{
  public:
    B(){
    }

};

class A{
  public:
    B* b; //Works perfectly
    A(){
      b = new B();
    }
};

在我的项目中,无法重新安排类以使错误消失。 有办法绕过此错误吗?

1 个答案:

答案 0 :(得分:0)

  

在我的项目中,无法重新安排类以使错误消失。有办法绕过此错误吗?

您正在描述循环依赖。 X取决于Y,而Y取决于X。这种依赖性是无法解决的。如果您可以从另一个类中删除对一个类的依赖,则可以重新定义这些定义,以便满足所有依赖。有时可以通过引入间接性来消除依赖性。

请注意,仅因为一个类定义(A)依赖于另一个类(B)的声明,但这并不一定意味着它依赖于该类的定义。您可以让一个类依赖于另一类的定义,而仍然使被依赖者类依赖于依赖者的声明。

此外,仅因为成员函数(A::A)的定义取决于另一个类(B)的定义,但这并不一定意味着该类(A)具有同样的依赖性。这是因为没有必要在类定义中定义成员函数。

例如,您的示例类A不依赖于B的定义。因此,A可以在B之前定义:

// declaration of B
// not a definition
class B;

// definition of A
class A{
  public:
    B* b;   // depends on declaration of B
            // does not depend on the definition
    A();
};

// definition of B
class B{
  public:
    B(){
    }
};

// definition of A::A
// does depend on definition of B
A::A() {
    b = new B();
}