在 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。
我目前有两个 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。