web-dev-qa-db-ja.com

クラスコードをヘッダファイルとcppファイルに分ける

私は、単純なクラスの実装と宣言のコードを新しいヘッダーとcppファイルに分ける方法について混乱しています。たとえば、次のクラスのコードをどのように分けますか。

class A2DD
{
  private:
  int gx;
  int gy;

  public:
  A2DD(int x,int y)
  {
    gx = x;
    gy = y;
  }

  int getSum()
  {
    return gx + gy;
  }
};
141
drdrdr

クラス宣言はヘッダファイルに入ります。 #ifndefインクルードガードを追加することが重要です。あるいは、MSプラットフォームを使用している場合は#pragma onceを使用することもできます。また、私はprivateを省略しました。デフォルトではC++クラスメンバはprivateです。

// A2DD.h
#ifndef A2DD_H
#define A2DD_H

class A2DD
{
  int gx;
  int gy;

public:
  A2DD(int x,int y);
  int getSum();

};

#endif

そして、実装はCPPファイルに入ります。

// A2DD.cpp
#include "A2DD.h"

A2DD::A2DD(int x,int y)
{
  gx = x;
  gy = y;
}

int A2DD::getSum()
{
  return gx + gy;
}
200
Ferenc Deak

一般的に、your.hにはクラス定義が含まれています。これはすべてのデータとすべてのメソッド宣言です。あなたの場合はこのように:

A2DD.h:

class A2DD
{
  private:
  int gx;
  int gy;

  public:
  A2DD(int x,int y);    
  int getSum();
};

そして、あなたの.cppはこのようなメソッドの実装を含みます。

A2DD.cpp:

A2DD::A2DD(int x,int y)
{
  gx = x;
  gy = y;
}

int A2DD::getSum()
{
  return gx + gy;
}
15
Nick

基本的に、関数宣言/定義の修正された構文

a2dd.h

class A2DD
{
private:
  int gx;
  int gy;

public:
  A2DD(int x,int y);

  int getSum();
};

a2dd.cpp

A2DD::A2DD(int x,int y)
{
  gx = x;
  gy = y;
}

int A2DD::getSum()
{
  return gx + gy;
}
5
Corbin

プロジェクトをファイルに分割したいだけの場合には、受け入れられた回答の手順は必要ないという、より広範な方法で主題を調査するときに、読者がこの質問につまずくことを指摘することは重要です。単一クラスの複数の実装が必要な場合にのみ必要です。クラスごとの実装が1つの場合、各ヘッダーファイルは1つだけで十分です。

したがって、受け入れられた答えの例から、この部分だけが必要です。

#ifndef MYHEADER_H
#define MYHEADER_H

//Class goes here, full declaration AND implementation

#endif

#ifndefなどのプリプロセッサ定義では、これを複数回使用できます。

PS。 C/C++が「ダム」であり#includeが「このテキストをこの場所にダンプする」と言っているにすぎないことを理解したら、トピックはより明確になります。

4
j riv

A2DD.h

class A2DD
{
  private:
  int gx;
  int gy;

  public:
  A2DD(int x,int y);

  int getSum();
};

A2DD.cpp

  A2DD::A2DD(int x,int y)
  {
    gx = x;
    gy = y;
  }

  int A2DD::getSum()
  {
    return gx + gy;
  }

アイデアは、ヘッダーファイルにすべての関数シグネチャとメンバを保持することです。
これにより、他のプロジェクトファイルは実装を知らなくてもクラスがどのように見えるかを見ることができます。

それ以外にも、ヘッダーの代わりに他のヘッダーファイルを実装に含めることができます。あなたのヘッダファイルに含まれているどのヘッダもあなたのヘッダファイルを含む他のどのファイルにも含まれる(継承される)ので、これは重要です。

4
Yochai Timmer

宣言はヘッダーファイルに残します。

class A2DD
{
  private:
  int gx;
  int gy;

  public:
    A2DD(int x,int y); // leave the declarations here
    int getSum();
};

そして定義を実装ファイルに入れます。

A2DD::A2DD(int x,int y) // prefix the definitions with the class name
{
  gx = x;
  gy = y;
}

int A2DD::getSum()
{
  return gx + gy;
}

2つを混在させることができます(たとえば、ヘッダーにgetSum()定義を残します)。これは、たとえばインライン展開の際にコンパイラにもっと良い機会を与えるので便利です。ただし、実装を変更すると(ヘッダーに残っている場合)、ヘッダーを含む他のすべてのファイルが再構築される可能性があります。

テンプレートの場合は、ヘッダーにすべて保存する必要があります。

3
Mat

通常は、宣言と本当に短いインライン関数だけをヘッダーファイルに入れます。

例えば:

class A {
 public:
  A(); // only declaration in the .h unless only a short initialization list is used.

  inline int GetA() const {
    return a_;
  }

  void DoSomethingCoplex(); // only declaration
  private:
   int a_;
 };
1