FB Brokken(C ++ Annotationsの作者)による半年間のC ++コースでは、いわゆる実装ヘッダーの使用法を教えられました。これがフランクの慣習であることは知っていましたが、文字通り他の場所では見たことがありません。したがって、私はその概念を説明し、他の人々がこれをどのように作っているのか非常に興味があります。
アイデアは#include
、クラスメンバーの実装の実装に必要なすべてのディレクティブ(クラス内の定義を記述していないと仮定)を1つのファイル、.ih実装ヘッダー、および#include
このファイルをすべてのソースに配置することです。代わりにファイル。選択肢は、
1)#include
クラスヘッダー内のすべて、または
2)#include
すべてのソースファイル内のすべてのヘッダーです。
両方の選択肢の欠点は明らかです。1a)いくつかの追加を必要とするものを追加した後、このヘッダーを
使用してすべてのソースを再コンパイルする必要があります。
1b)クラスの明確なインターフェースであると思われるヘッダーファイルは、ユーザーが何に使用されているのかわからず、気にもしない大量のディレクティブで汚染されています。2a)各ソースファイルで何度も同じヘッダーを使用する必要があります。
2b)実装はこれらすべてによって汚染されており、少し乱雑に見えます。#include
#include
#include
#include
#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";
}
繰り返しになりますが、問題は次のとおりです。そのようなコンベンションについて聞いたことがある人はいますか?私は誰かにそれを使い始めるように説得しましたか?私は個人的にそれが非常に有用な(明白でさえある)慣習であると思います、そして私はそれを他のどこにも見たことがないことに少し驚いています。