最近クラスSquare
を作成しました:
=========ヘッダーファイル======
class Square
{
int m_row;
int m_col;
public:
Square(int row, int col): m_row(row), m_col(col)
};
========== cppファイル======
#include "Square.h"
Square::Square(int row, int col)
{
cout << "TEST";
}
しかし、その後、多くのエラーを受け取ります。 cppファイルを削除し、ヘッダーファイルを次のように変更した場合:
=========ヘッダーファイル======
class Square
{
int m_row;
int m_col;
public:
Square(int row, int col): m_row(row), m_col(col) {};
};
エラーはありません。初期化リストがヘッダーファイルに表示される必要があるということですか?
あなたが持つことができます
==============ヘッダーファイル================
class Square
{
int m_row;
int m_col;
public:
Square(int row, int col);
};
================== cpp ====================
Square::Square(int row, int col):m_row(row), m_col(col)
{}
初期化リストはコンストラクターのdefinitionの一部ですそのため、コンストラクタの本体を定義するのと同じ場所で定義する必要があります。これは、ヘッダーファイルにそれを含めることができることを意味します。
public:
Square(int row, int col): m_row(row), m_col(col) {};
または.cppファイルで:
Square::Square(int row, int col) : m_row(row), m_col(col)
{
// ...
}
ただし、.cppファイルに定義があり、ヘッダーファイルに定義がある場合は、その宣言のみが必要です。
public:
Square(int row, int col);
初期化リストは、定義ではない宣言ではなく、コンストラクター定義とともに表示されます。したがって、オプションは次のいずれかです。
Square(int row, int col): m_row(row), m_col(col) {}; // ctor definition
クラス定義などで:
Square(int row, int col); // ctor declaration
クラス定義で:
Square::Square(int row, int col): m_row(row), m_col(col) {} // ctor definition
他の場所。 「Elsewhere」は、inline
にすると、ヘッダーに含めることができます。
要件ではありません。ソースファイルにも実装できます。
// In a source file
Square::Square(int row, int col): m_row(row),
m_col(col)
{}
このようなメンバー初期化リストと呼ばれる変数の初期化。メンバー初期化リストは、ヘッダーファイルまたはソースファイルで使用できます。それは問題ではありません。ただし、コンストラクターは、ヘッダーファイルで初期化するときに定義する必要があります。詳細については、 C++メンバー初期化リスト を参照してください。