C ++“规则”,用于在头文件与源/实现文件中包含关键字

时间:2013-03-01 13:10:26

标签: c++ inheritance polymorphism header-files

老实说,我对头文件中函数(有时是数据成员)声明中的关键字与实现文件中的内容之间的混淆感到困惑。

要遵循的规则是什么?例如

(根据评论更新)

  • 标题文件不包含实现,除非该函数声明为" inline"
  • 数据成员不包含默认值,除非该类型是static,const,int / enum(除非是C ++ 11)
  • 公共/私人/受保护通常出现在头文件
  • "静态"通常出现在头文件中,而不是实现文件。

您可以使用其他任何规则吗?常量?

继承怎么样?我认为"虚拟"只进入头文件?如果我将类A中的虚函数继承到B类,那么B类的头文件是否必须声明它覆盖的虚函数?那么A类中的纯虚函数怎么样,当我在B类中重写时,我必须在派生类的头文件中包含纯虚函数定义吗?

2 个答案:

答案 0 :(得分:2)

看起来你正试图制定一些正式的规则而不了解它是如何工作的。但它非常简单,当预处理器看到#include指令时,它只是将其替换为该文件的内容(就像命令复制整个文件并将其粘贴在此处)。因此,不要制定正式规则只是问自己问题:这个语句是否应出现在使用此标头的每个.cpp文件中?他们还会编译吗?我到底真的需要它,或者它只能在一个提供实现的.cpp文件中吗?如果答案是肯定的,那么这个语句应该转到标题,如果没有,那么把它放到.cpp实现文件中。

答案 1 :(得分:1)

C和C ++中的#include语句比你的功能要简单得多:它会获取include'd文件的内容,并将其直接转储到包含文件中。这可以是任何东西(我在我的工作中看到很多新手开发人员。如果它是磁盘上的文件,某些人试图include):甚至.cpp文件。你可以,如果你想向自己证明,请复制&粘贴包含文件的内容代替include - 一切都应该像以前一样工作。

为了完整性:一旦预处理器将所有包含的文件转储到它们所要求的位置,编译器就会单独编译每个文件。这通常会为您留下一堆没有实现的声明和一堆没有声明的实现:链接器会对这些引用进行排序。因此,如果您遇到链接器错误,这意味着您错误地匹配了某些内容:可能您已经声明了两次,或者从未实现过。

我们实际拥有的是一系列有关头文件中所需内容以及源文件中所需内容的最佳实践。通常,我们喜欢在头文件中声明。 换句话说,头文件应该告诉我(程序员)我希望在实现中找到什么东西。通常,这些是声明:因此您通常只在标头中看到访问修饰符(public,private,protected)。一些程序员会做一些“奇怪”的事情,比如在头文件中编写构造函数:这是有效的,但通常不是预期的 - 你希望你的头文件告诉我你可以在代码中使用哪些东西,而不是你的代码是如何工作的。