web-dev-qa-db-ja.com

ヘッダーファイルで初期化リストを定義する必要がありますか?

最近クラス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) {};
};

エラーはありません。初期化リストがヘッダーファイルに表示される必要があるということですか?

38
E235

あなたが持つことができます

==============ヘッダーファイル================

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) 
{}
35
uba

初期化リストはコンストラクターの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);
54
LihO

初期化リストは、定義ではない宣言ではなく、コンストラクター定義とともに表示されます。したがって、オプションは次のいずれかです。

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にすると、ヘッダーに含めることができます。

8
Steve Jessop

要件ではありません。ソースファイルにも実装できます。

// In a source file
Square::Square(int row, int col): m_row(row), 
                                  m_col(col) 
{}
3
Mahesh

このようなメンバー初期化リストと呼ばれる変数の初期化。メンバー初期化リストは、ヘッダーファイルまたはソースファイルで使用できます。それは問題ではありません。ただし、コンストラクターは、ヘッダーファイルで初期化するときに定義する必要があります。詳細については、 C++メンバー初期化リスト を参照してください。

0
Arul Kumar