在 C++ 中避免 Class 定义中的循环依赖

Avoiding Circular Dependencies in Class Definitions in C++

我目前有两个 classes:foo 和 bar。 Foo 在其方法之一中使用 bar 的实例,而 bar 在其构造函数中使用 foo 的实例。但是,这不会编译。我知道存在循环依赖,所以我试图通过在头文件中声明 foo 的方法之前在 foo 中前向声明 bar 来打破这种依赖。那失败了,因为我实际上根本无法在源文件的 foo 方法中使用 bar 或其任何组件。然后我尝试重新排列它,以便源文件中 bar 需要的所有内容都已经定义,然后我放入 bar 的所有定义,然后我在 foo 中定义了使用 bar 的方法。出于同样的原因,那次失败了。到目前为止,这是我的代码的简化版本:

// Header.h
class foo{
    class bar;

    void method(bar& b);
};

class bar{
    bar(foo& f, double d); 
};

// Source.cpp
#include Header.h
// stuff defining foo that I need for bar in the form foo::foo(...){...}

// stuff defining bar that I need for foo::method

void foo::method(bar& b){
    // do stuff with foo and b
}

我想指出的是,当我在 foo::method 的定义中删除对 bar 实例的引用时,代码可以正确编译和运行。

我的具体示例将 foo class 作为齐次坐标中的向量,将 bar class 作为四元数。四元数 class 在其构造函数中使用向量和旋转角度,向量 class 在其旋转方法中使用四元数。

有没有一种方法可以在不删除依赖项的情况下进行编码,或者我应该只删除其中一个依赖项?

尝试向前声明 bar foo 之外:

class bar;

class foo{
    method(bar& b);
}

class bar{
    bar(foo& f, double d); 
}

正如你在那里所做的那样,你向前声明了一个名为 foo::bar 的 class。