我习惯于对这样的类进行前向声明:
// file 1
#ifndef A_HPP
#define A_HPP
class A
{
...
};
#endif
// file 2
#ifndef B_HPP
#define B_HPP
#ifndef A_HPP
class A;
#endif
class B
{
};
#endif
正如您在file 2
中所看到的,我尝试保护A
的前向声明。因此,不应该重新声明A。
我看过很多代码,他们没有把守卫放在前方声明中。
我想知道我在做什么是非常必要的,或者是否增加了某种安全性。这些方法中的任何一种都会比其他方法更有利于编译时间吗?你会用哪一个?为什么呢?
答案 0 :(得分:3)
你没有增加任何安全性。 C ++中的声明可以随时重复,只要它们都是连贯的。
此外,这不是一个好习惯。我从未见过有人那样做过。想想如果从A
移动a.hpp
的定义会发生什么:你应该在所有文件中更改A
前向声明的所有范围保护。生活已经足够复杂了。
答案 1 :(得分:2)
您不需要使用marco防护,因为编译器将知道如何处理这两个文件。
无需在file2.h中输出以下3行
#ifndef A_HPP
class A;
#endif
使用以下行已经足够
#include "file1.h"
前瞻性声明的概念
前向声明用于通知编译器有一个类(或结构或任何你想要的类型)命名为" A"在阅读文件时。但编译器知道声明在这里不具体,但可能在另一个文件中。
那时,编译器会知道:
1)好的,有一个名为" A"的课程,我会记住它。
2)我不知道它的大小和细节。但是如果编码器只使用A *(A的指针),那就可以了,我不需要知道A的细节。
前向声明很有用。特别是课程是相互关联的。
但是,如果A的类型名称在两个文件之间不同步。 g ++将无法编译。
编制时间
前向声明也很好用,因为它可以节省编译时间。
如果文件没有改变,g ++将不会再次重新编译。
虽然文件2只使用前向声明,但无论你如何更改文件1或类A,文件2都不会再次编译。