0

非常に一般的なコーディング方法は、クラスごとに.hおよびファイルを使用して、クラスのインターフェイスをそのメンバー関数の実装から分離することです。.cppそのため、ヘッダーファイルと対応するファイルclass Fooで実現されます。Foo.hFoo.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

これには、インターフェイスと実装をより適切に分離できるという利点があり、実際にコンパイルするというさらなる利点があります (私の限られたテストで)。

私の質問は、この規則を採用することで何か隠れた落とし穴がありますか?

4

2 に答える 2

2

Value クラスを使用するすべてのファイルに「value.h」と「value.hpp」の両方を含める必要があるため、コンパイル時間にメリットはありません。しかし、「コンパイルする」という意味と、実装を .cpp ファイルに入れるソリューションを意味する場合、はい、利点があります。

もちろん、ファイルが大量の実装コードで雑然とすることなく、クラスによって提供されるインターフェイスを簡単に確認できるという利点があります。

「value.h」と「value.hpp」の命名規則が「最良の」選択であるかどうかはわかりません。2 番目のファイルには「value.inl」という名前が適していると思います。

于 2013-09-20T13:02:22.747 に答える
1

いいえ、このソリューションには特別な落とし穴はありません。.hpp ファイルは、テンプレート化されたクラスによって宣言されたメソッドの定義を含む別のヘッダー ファイルです。テンプレート化されたクラスのメソッドはヘッダー ファイルで定義する必要があるため、これは宣言を定義から分離するための便利な方法です。拡張子 .hpp は、これがヘッダーと実装ファイルのハイブリッドであり、一般的に使用されていることを示しています。

于 2013-09-20T13:03:56.667 に答える