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

How to use instances of two classes in each others

本文关键字:两个 实例      更新时间:2023-10-16

就像标题状态一样;假设我有两个头文件:

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

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

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

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

是否可以以某种方式使用 include/forward 声明来完成这项工作?

果然如此。

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

因此,两个类都不依赖于另一个类的定义,而只依赖于声明。因此,只需在定义另一个之前向前声明一个。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;
}