【发布时间】:2012-05-10 19:40:06
【问题描述】:
此问题已关闭,因为它被认为与以下内容重复:
- C++ cyclical header dependency
- cyclic dependency between header files
- C++ error: 'Line2' has not been declared
但是另一个问题与我的不同:他们提出了不同的情况,而答案不适用于我的问题。他们的回答建议将该函数放入.cpp 文件中,并在声明它之前定义类。我不能把函数放在.cpp,因为我的类是一个模板,我已经定义了这个类,但是没有用。
我有两个头文件a.h 和b.h。其中定义了两个模板类A 和B。
A 的函数需要与B 的对象一起使用,反之亦然。由于它们是模板类,我不能把函数放在.cpp文件中,它必须留在头文件中,而且因为包含的顺序,我很头疼。
什么是解决这个问题的好方法?
目前我移动函数定义并找到一种方法以正确顺序包含标题,但这总是变得更加复杂。此外,我不喜欢函数定义远离类声明(例如在其他文件中)。
示例代码:
啊.h
#ifndef A_H
#define A_H
#include <iostream>
#include "b.h"
template< typename T > class B;
template< typename T >
class A {
public:
B<void> *b;
void f();
void g();
};
template< typename T > void A<T>::f() {
std::cout << "A::f" << std::endl;
b->f();
}
template< typename T > void A<T>::g() {
std::cout << "A::g" << std::endl;
}
#endif
b.h
#ifndef B_H
#define B_H
#include <iostream>
#include "a.h"
template< typename T > class A;
template< typename T >
class B {
public:
A<void> *a;
void f();
void g();
};
template< typename T > void B<T>::f( ) {
std::cout << "B::f" << std::endl;
}
template< typename T > void B<T>::g( ) {
std::cout << "B::g" << std::endl;
a->g();
}
#endif
main.cpp
#include "a.h"
#include "b.h"
int main( ) {
A<void> a;
B<void> b;
a.b = &b;
b.a = &a;
a.f();
b.g();
return 0;
}
这不起作用,因为a.h 包含b.h。 b.h 则不能包含a.h,因此B::g 是错误的。
对于这个示例代码,我可以将B::g 移动到main.cpp 或a.h 的末尾,但是对于更复杂的程序,这并不容易。
【问题讨论】:
-
向我们展示一些最小代码,不幸的是没有捷径可以解决这个问题。
-
@BillyONeal:不,我的情况不同,因为我的类是模板:我不能将函数的声明放在源文件中,也不能声明类(
class A;)不能解决我的问题问题。 -
@RitardiGiuseppe:为什么不呢?你可以像声明类一样声明类模板。
标签: c++ class header include dependencies