55

最近私はクラスを作成しました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) {};
};

エラーなしで準拠します。初期化リストをヘッダーファイルに含める必要があるということですか?

4

5 に答える 5

77

初期化リストはコンストラクターの定義の一部であるため、コンストラクターの本体を定義するのと同じ場所でリストを定義する必要があります。これは、ヘッダーファイルに次のいずれかを含めることができることを意味します。

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);
于 2013-03-11T09:40:19.750 に答える
43

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

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

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) 
{}
于 2013-03-11T09:38:54.830 に答える
10

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

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

于 2013-03-11T09:39:59.443 に答える
3

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

// In a source file
Square::Square(int row, int col): m_row(row), 
                                  m_col(col) 
{}
于 2013-03-11T09:37:21.863 に答える
0

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

于 2013-03-11T09:59:07.273 に答える