说我有两个文件A.hpp和B.hpp
A.hpp:
#indef DEF_A
#define DEF_A
class A{
/*implementation of class A*/
/*some part of it needs B*/
#ifdef DEF_B
void method(B b){/*do something with B*/}
#endif
}
#endif
B.hpp:
#indef DEF_B
#define DEF_B
class B{
/*implementation of class B*/
/*some part of it needs A*/
#ifdef DEF_A
void method(A a){/*do something with A*/}
#endif
}
#endif
我不想把A.hpp包括在B.hpp中(反之亦然),因为每次我需要A.hpp时我都需要B.hpp(反之亦然)。
但是当我在主文件中写道:
的main.cpp
#include"A.hpp"
#include"B.hpp"
int main(){
A a;
B b;
}
A::method(B b)
未知。如果我撤消包含顺序,我将只有B::method(A a)
。
当包含两个标题时,是否有办法访问这两种方法?
[编辑] 该方法也适用于没有.cpp文件的模板类。 [/编辑]
答案 0 :(得分:2)
我会使用前向声明,例如:
<强> A.hpp 强>
#indef DEF_A
#define DEF_A
class B; // Forward declaration of B
class A { // Definition of A
public:
void method(const B& b);
};
#endif
<强> A.cpp 强>
#include "A.hpp"
#include "B.hpp"
void A::method(const B& b) { /* your implementation */ }
<强> B.hpp 强>
#indef DEF_B
#define DEF_B
class A; // Forward declaration of A
class B { // Definition of B
public:
void method(const A& a);
};
#endif
<强> B.cpp 强>
#include "B.hpp"
#include "A.hpp"
void B::method(const A& a) { /* your implementation */ }
然后在 main.cpp 中 当你同时使用它们时,你包括 A.hpp 和 B.hpp 。 但是如果在C.cpp中你只使用A(没有B)你可以做
<强> C.cpp 强>
#include "A.hpp"
void foo()
{
A a;
// B b; // If uncommented, that would fail to compile.
}
答案 1 :(得分:0)
也许你应该试试pimpl-idiom。您可以轻松地隐藏.cpp文件中的实现细节,即使它是关于模板化的类:
//Important: fwd declaration as Jarod42 already stated!
class B;
class AImpl;
class A
{
void aMethod( B* b )
{
impl->( b );
}
AImpl* impl; //this will work because compiler need not to know
//exact object size as we are creating a pointer or
//reference...type definition in cpp
}
// same here for B;
//in cpp file of A and B:
class AImpl : public TemplateClass<X>
{
void aMethod( B* b ){}
};
我希望这能帮到你解决问题!