在 FB Brokken(The C++ Annotations 的作者)的半年 C++ 课程中,我们学会了使用所谓的实现头文件。我知道这是弗兰克的约定,但实际上我从未在其他任何地方见过它。因此,我将解释这个概念,我很好奇其他人对此有何看法。
这个想法是,您只需将#include
类成员的实现所需的所有指令(假设您没有编写类内定义)放在一个文件中,.ih 实现标头和#include
每个源中的该文件文件。替代方案是
1)#include
类头文件中的所有内容或
2)#include
每个源文件中的所有头文件。
这两种替代方案的缺点是显而易见的:
1a)#include
在添加任何需要额外#include
的 's 后,您必须重新编译所有源文件。
1b)你的头文件,应该是你的类的清晰接口,被一大堆#include
指令污染,用户不知道它们的用途,他也不关心。2a)您必须#include
在每个源文件中一次又一次地使用相同的标题。
2b)你的实现被所有这些污染了#include
,让它看起来有点乱。
只是要清楚:
/* someclass.h(pp) */
#ifndef SOME_CLASS_H
#define SOME_CLASS_H
class SomeClass
{
//some private data members
public:
SomeClass();
void sayHi() const;
// some more member functions
private:
// some private member functions
};
#endif
/* someclass.ih */
#include "someclass.h"
#include <iostream>
#include <vector>
using namespace std;
// namespace is now only used in my implementations, other people
// including my headers won't accidentally import the entire std namespace.
/* sayhi.cc */
#include "someclass.ih"
void SomeClass::sayHi() const
{
cout << "sayHi() says hi!\n";
}
现在,再次,问题是:有没有人听说过这样的约定?我说服任何人开始使用它了吗?我个人觉得它是一个非常有用(甚至是显而易见的)约定,我有点惊讶我在其他任何地方都没有看到它。