如果您已经包括警卫人员,是否需要提前声明?

时间:2019-05-22 19:00:53

标签: c++

如果您有一组带有包含保护的头文件,是否真的有必要进行前向声明?

我一直出于习惯在这样做,所以我建议一位同事在他们的代码中添加前向声明,但是当他们询问是否确实需要包含已存在的包含保护措施时,我有点的损失。看来这是个好习惯,但是难道没有让守卫解决前向声明所能解决的所有问题吗?

这是一个例子。假设我有一个这样的头文件:

//This is the header file of class B
class MyClassA; //This is forward declaration    

class B{
    private:
        MyClassA *myClass; //pointer to MyClassA
    public:
        B(){}
        ~B(){};

        void print(MyClassA* myClass); //Passing by reference. Not calling any methods of MyClassA.
}

如果我知道MyClassA.h中有一个include防护,那么上面的方法会比下面的方法更好吗?而且,如果是这样,为什么?

#include “MyClassA.h”  

class B{
    private:
        MyClassA *myClass; //pointer to MyClassA
    public:
        B(){}
        ~B(){};

        void print(MyClassA* myClass); //Passing by reference. Not calling any methods of MyClassA.
}

第二个示例还会阻止循环声明/多重声明吗?

1 个答案:

答案 0 :(得分:1)

您正在混合两个不相关的概念。

  1. 仅在需要按名称的名称时使用前向声明。

  2. 使用include防护可防止在单个翻译单元(即.cpp文件)中多次处理同一代码。是否使用包含保护取决于.h文件的预期用途。大多数情况下,您不希望在.cpp文件中多次处理文件的内容,但是在某些情况下,允许这样做至关重要。对于以后的用途类别,不得使用包含防护。

您可以随意组合它们。

可以:

  1. 使用前向声明,并使用包括防护。
  2. 使用前向声明,而不使用包含警戒。
  3. 请勿使用前向声明,而应使用包含防护。
  4. 不使用前向声明,也不使用包含保护。