如何在彼此中使用两个类的实例

时间:2018-01-25 17:01:35

标签: c++ header include forward-declaration

正如标题所述;想象我有这两个头文件:

// a.h
class A {
    A();
    B operator+(A);
}

// b.h
class B {
    B(A);
}

使用包含/转发声明是否可以以某种方式使这项工作成为可能?

我当然看到了许多相关的问题,但它们通常要么AB包含彼此的实例(这显然是不可能的),要么可以用指针或引用而不是对象来修复实例。但是,我仍然希望B的构造函数实际使用A实例,这可能吗?

1 个答案:

答案 0 :(得分:3)

  

使用包含/转发声明是否可以以某种方式使这项工作成为可能?

肯定是。

函数的声明仅取决于其参数类型和返回的声明。它们不依赖于定义。

因此,两个类都不依赖于另一个类的定义,而只依赖于声明。因此,在定义另一个之前,只需向前声明一个。 B A::operator+确实取决于B的定义,B::B取决于A的定义,因此必须按正确的顺序定义。其中至少有一个必须在类的定义之外定义,以满足依赖性要求。

  • 定义A

    • 声明B
    • 定义A
  • 定义B

    • 声明A
    • 定义B
  • 定义B A::operator+

    • 按任意顺序定义AB
    • 定义B A::operator+
  • 定义B::B

    • 按任意顺序定义AB
    • 定义B::B

一个例子:

struct B;
struct A {
    B operator+(A);
};
struct B {
    B(A){}
};
B A::operator+(A) {
    return {*this};
}
int main() {
    A a;
    B b = a+a;
}