如何在彼此中使用两个 类 的实例
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 声明来完成这项工作?
我当然见过很多相关问题,但它们通常要么 A
和 B
包含彼此的实例(这显然是不可能的),要么可以用指针或引用来修复的对象实例。但是,我仍然希望 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+
- 按任意顺序定义
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;
}
如题所说;假设我有这两个头文件:
// a.h
class A {
A();
B operator+(A);
}
和
// b.h
class B {
B(A);
}
是否有可能使用 includes/forward 声明来完成这项工作?
我当然见过很多相关问题,但它们通常要么 A
和 B
包含彼此的实例(这显然是不可能的),要么可以用指针或引用来修复的对象实例。但是,我仍然希望 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+
- 按任意顺序定义
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;
}