6

さまざまな画像形式をロードするために使用される ImageLoader というクラスを作成しています。さまざまな画像形式に対して、特定の構造体が使用されます。たとえば、bmp ファイルの場合、BITMAPFILEHEADER 構造体と他に 2 つの構造体があります。

私が知りたいのは、クラス定義をヘッダー ファイルに入れるときに、struct typedefs をクラス定義の一部にするのか、それともクラス定義の外で分離するのかということです。

構造体変数を宣言しているだけなら、それは明らかにクラスで発生するため、わかりませんが、型を定義しているため、クラス内で型を定義することが適切な設計と見なされるかどうかはわかりません。

4

6 に答える 6

7

私の一般的なルールは、そのクラスと組み合わせてのみ使用する場合は、内部で宣言することです(所有権を意味します)。それ以外の場合は、個別に宣言してください。

于 2012-04-13T16:15:38.870 に答える
3

可能な限りヘッダーからすべてを除外すると、カプセル化が向上します。クラスの一部のメソッドが構造体のパラメーターまたは戻り値の型を必要とする場合でも、前方宣言で回避できる場合があります。

ヘッダーに入れる必要があるのは、それがパブリック インターフェイスの一部である場合だけです。

クラスに入るかどうかについては、それ自体で役立つか、それともクラスに完全に従属するかを検討してください。独立できる場合は、おそらく独自のヘッダーに入れる必要があります。

于 2012-04-13T16:58:11.330 に答える
3

クラスで型を宣言することが悪い設計の指標であるとは言いません。あなたの「デザイン」への言及が「読みやすさ」の線に沿った何かを意味すると仮定すると、私は一貫性を重視し、同じ関係を同じ方法で表現することを主張します.

そうでなければ、入れ子型に対する神の怒りに襲われることはありません (SGI がくすぶっているクレーターではないことを考えると)。これはかなりコンテキスト中心であるため、要件に基づいて定義するもの以外に厳格な規則はありません。

クライアントのアクセシビリティが問題にならない場合は、ヘッダーの適切なスコープでほとんどすべてを宣言し、コードの意味を文書化するだけです。繰り返しますが、これは厳密な使用法/読みやすさのガイドラインがない場合です。もしそうなら、私はマークの提案に行きます。

2 セント: イメージの種類を列挙し、構成データに 1 つの public 構造体を使用して、他のすべてを密室に引き込むことを正当化することができます。

于 2012-04-14T05:08:34.350 に答える
1

BITMAPFILEHEADERは、Win32 プラットフォーム SDK で定義されている構造です。私はそれとあなたのクラスに関するあなたの要求を理解できたかどうか確信が持てません...

一般に、クラスのクライアントに公開されていない構造を定義している場合は、クラスのプライベート部分、またはDetailsヘッダー ファイルのサブ名前空間で定義します。たとえば、次のようになります。

namespace YourCoolLibrary
{
  namespace Details
  {
    struct SomeInternalStructure
    {
      ...
    };

  } // namespace Details


  class YourCoolClass
  {
    ...
  private:
    Details::SomeInternalStructure m_something;
  };

} // namespace YourCoolLibrary
于 2012-04-13T17:10:40.970 に答える
1

さらに多くの選択肢があります。クラスに配置する場合は、パブリック、プロテクト、またはプライベートのいずれかを選択して、クラスのすべてのユーザーがクラス定義を表示できるようにするか、派生クラスのみを表示するか、他のクラスを表示しないようにする必要があります。

クラス定義の詳細が必要ない場合は、簡単にするために、前方宣言のみを ImageLoader に入れます。次に、内部クラスの完全な定義が実装ファイルに入ります。

私の経験則は、名前をできるだけローカルにすることです。そのため、誤って間違った場所で使用すると、コンパイラが文句を言います。

于 2012-04-13T18:02:07.213 に答える
0

作成しているクラスに論理的に属している場合typedefは、内部に入れます。それが世界レベルで理にかなっている場合は、それを外に残してください。

于 2012-04-13T16:14:19.383 に答える