正如标题所述;想象我有这两个头文件:
// a.h
class A {
A();
B operator+(A);
}
和
// b.h
class B {
B(A);
}
使用包含/转发声明是否可以以某种方式使这项工作成为可能?
我当然看到了许多相关的问题,但它们通常要么A
和B
包含彼此的实例(这显然是不可能的),要么可以用指针或引用而不是对象来修复实例。但是,我仍然希望B
的构造函数实际使用A
实例,这可能吗?
答案 0 :(得分:3)
使用包含/转发声明是否可以以某种方式使这项工作成为可能?
肯定是。
函数的声明仅取决于其参数类型和返回的声明。它们不依赖于定义。
因此,两个类都不依赖于另一个类的定义,而只依赖于声明。因此,在定义另一个之前,只需向前声明一个。 B A::operator+
确实取决于B
的定义,B::B
取决于A
的定义,因此必须按正确的顺序定义。其中至少有一个必须在类的定义之外定义,以满足依赖性要求。
定义A
:
B
A
定义B
:
A
B
定义B A::operator+
A
和B
B A::operator+
定义B::B
A
和B
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;
}