私は、単純なクラスの実装と宣言のコードを新しいヘッダーとcppファイルに分ける方法について混乱しています。たとえば、次のクラスのコードをどのように分けますか。
class A2DD
{
private:
int gx;
int gy;
public:
A2DD(int x,int y)
{
gx = x;
gy = y;
}
int getSum()
{
return gx + gy;
}
};
クラス宣言はヘッダファイルに入ります。 #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;
}
一般的に、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;
}
基本的に、関数宣言/定義の修正された構文
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;
}
プロジェクトをファイルに分割したいだけの場合には、受け入れられた回答の手順は必要ないという、より広範な方法で主題を調査するときに、読者がこの質問につまずくことを指摘することは重要です。単一クラスの複数の実装が必要な場合にのみ必要です。クラスごとの実装が1つの場合、各ヘッダーファイルは1つだけで十分です。
したがって、受け入れられた答えの例から、この部分だけが必要です。
#ifndef MYHEADER_H
#define MYHEADER_H
//Class goes here, full declaration AND implementation
#endif
#ifndefなどのプリプロセッサ定義では、これを複数回使用できます。
PS。 C/C++が「ダム」であり#includeが「このテキストをこの場所にダンプする」と言っているにすぎないことを理解したら、トピックはより明確になります。
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;
}
アイデアは、ヘッダーファイルにすべての関数シグネチャとメンバを保持することです。
これにより、他のプロジェクトファイルは実装を知らなくてもクラスがどのように見えるかを見ることができます。
それ以外にも、ヘッダーの代わりに他のヘッダーファイルを実装に含めることができます。あなたのヘッダファイルに含まれているどのヘッダもあなたのヘッダファイルを含む他のどのファイルにも含まれる(継承される)ので、これは重要です。
宣言はヘッダーファイルに残します。
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()
定義を残します)。これは、たとえばインライン展開の際にコンパイラにもっと良い機会を与えるので便利です。ただし、実装を変更すると(ヘッダーに残っている場合)、ヘッダーを含む他のすべてのファイルが再構築される可能性があります。
テンプレートの場合は、ヘッダーにすべて保存する必要があります。
通常は、宣言と本当に短いインライン関数だけをヘッダーファイルに入れます。
例えば:
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_;
};