C ++前向声明和文件设计

时间:2013-09-25 21:03:35

标签: c++ forward-declaration

我读过很多关于前瞻性声明的文章,但我还有一个问题。 我们假设有:

// File a.hpp (in this question I avoid writing guards in header files, for the sake of simplicity)

class A
{
    // Class B is used only by pointer, the compiler doesn't need to know the structure
    // of the class, so a forward declaration is enough
    public:
        A(void);
        void Method1(B *pB);
        void Method2(B *pB);           
};

// File a.cpp

#include "a.hpp"

A::A(void) { }

// Some methods of class B are used, so the compiler needs to know the declaration of the class, it cannot be forward declared

void A::Method1(B *pB)
{
    // Something...
    pB->SomeMethod();
    // Something ...
}

void A::Method2(B *pB)
{
    int var = pB->GetSomeMember();
    // Something ...
}

好的,现在让我们假设有一个用于B类声明的头文件和另一个用于其前向声明的头文件:

// File b.hpp

// Class declaration
class B
{ 
/* ... */
};

// File b_fwd.hpp

// Forward declaration
class B;

基于前面的考虑,我想到的是在a.hpp中包含“b_fwd.hpp”(只需要B类的前向声明),并在a.cpp中包含“b.hpp”。文件(需要声明), 如下:

// File a.hpp

#include "b_fwd.hpp"  // Forward declaration of class B

class A
{
    public:
        A(void);
        void Method1(B *pB);
        void Method2(B *pB);           
};

// File a.cpp

#include "a.hpp"
#include "b.hpp"  // Declaration of class B

A::A(void) { }

void A::Method1(B *pB) { /* like before ... */ }

void A::Method2(B *pB) { /* like before ... */ }

我知道这有效,但是因为在A级我包括(让我们说)“两次”B级,第一次前进宣布而第二次“正常”,这对我来说听起来有点奇怪。我想知道这是不是一个好的做法,如果它可以在项目中完成或不做。

1 个答案:

答案 0 :(得分:4)

我经常使用这种技术取得巨大成功。

并回答“为什么不向前宣布它?”的问题。有时难以转发申报。例如,如果类是模板类,则前向声明必须包含模板参数以及类名。