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

标签 c++ header include forward-declaration

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

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

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

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

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

最佳答案

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

当然是。

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

因此,两个类都不依赖于另一个类的定义,而只依赖于声明。所以在定义另一个之前简单地转发声明一个。 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;
}

关于c++ - 如何在彼此中使用两个类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48448283/

相关文章:

c++ - 循环依赖性头痛

添加项目后,C++ find() 函数不起作用

c++ - 引入所有 std header 的 <std.h> 文件的缺点?

c++ - Boost.Compute 比普通 CPU 慢?

c++ - Leetcode 987:二叉树的垂直顺序遍历:为什么我获得TLE?

c# - 如何在报表查看器中添加参数?

php - Pico CMS 自定义 header

C++ 头文件链接器错误

c - 使#include "foo/bar.h"实际上得到 "foo/inc/bar.h"

c - 在将 sqlite3 包含到我的项目中时遇到问题,makefile 没有执行我想要的操作