带有条件编译的c ++头包含顺序

时间:2014-07-03 06:54:59

标签: c++ compilation header

说我有两个文件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文件的模板类。 [/编辑]

2 个答案:

答案 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 ){}
};

我希望这能帮到你解决问题!