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

时间:2016-08-13 05:07:37

标签: c++ class c++11 circular-dependency quaternions

我目前有两个课程:foo和bar。 Foo在其中一个方法中使用bar实例,bar在其构造函数中使用foo实例。但是,这不会编译。我知道存在循环依赖,所以我试图通过在foo的头文件中声明foo方法之前在foo中声明bar来突破这一点。这失败了,因为我实际上不能在源文件中的foo方法中使用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类作为同构坐标中的向量,将bar类作为四元数。四元数类在其构造函数中使用向量和旋转角度,向量类在其旋转方法中使用四元数。

有没有办法在不删除依赖项的情况下对此进行编码,还是应该删除其中一个依赖项?

1 个答案:

答案 0 :(得分:1)

尝试在bar之外声明foo

class bar;

class foo{
    method(bar& b);
}

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

正如你在那里所做的那样,你正在宣布一个名为foo::bar的课程。