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

How to use instances of two classes in each others

如题所说;假设我有这两个头文件:

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

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

是否有可能使用 includes/forward 声明来完成这项工作?

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

Is it somehow possible to make this work using includes/forward declares?

确实如此。

函数的声明只依赖于参数类型的声明和return。它们不依赖于定义。

因此,class 都不依赖于另一个的定义,而只依赖于声明。所以在定义另一个之前简单地转发声明一个。 B A::operator+ 确实取决于 B 的定义,B::B 确实取决于 A 的定义,因此必须以正确的顺序定义它们。为了满足依赖性要求,必须在 class 的定义之外定义其中至少一个。

  • 定义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;
}