非常に一般的なコーディング方法は、クラスごとに.h
およびファイルを使用して、クラスのインターフェイスをそのメンバー関数の実装から分離することです。.cpp
そのため、ヘッダーファイルと対応するファイルclass Foo
で実現されます。Foo.h
Foo.cpp
これは、ジェネリック クラスの特殊なケースではウィンドウの外に放り出されることが多く、代わりにヘッダーのみのライブラリを使用して、実装の詳細でインターフェイス ファイルが乱雑になる場合でも、コンパイラを満足させます。
私は最近、次のように書かれたコードに出くわしました。この.h
ファイルには、インターフェイスと、ジェネリック メンバー関数の実装を含むファイル#include
へのが含まれています。.hpp
たとえば、タイプ T の単純なコンテナーの場合
Value.h
#ifndef VALUE_H
#define VALUE_H
template <typename T>
class Value
{
public:
Value(T value);
void set(T value);
T get() const;
private:
T data;
};
#include "Value.hpp"
#endif
および対応するValue.hpp
#ifndef VALUE_HPP
#define VALUE_HPP
template <typename T>
Value<T>::Value(T value) : data(value)
{
}
template <typename T>
void Value<T>::set(T value)
{
data = value;
}
template <typename T>
T Value<T>::get() const
{
return data;
}
#endif
これには、インターフェイスと実装をより適切に分離できるという利点があり、実際にコンパイルするというさらなる利点があります (私の限られたテストで)。
私の質問は、この規則を採用することで何か隠れた落とし穴がありますか?