Подтвердить что ты не робот

Требуется ли определить список инициализации в файле заголовка?

Недавно я создал класс 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) {};
};

он не содержит ошибок. Означает ли это, что список инициализации должен отображаться в файле заголовка?

4b9b3361

Ответ 1

У вас может быть

============== заголовочный файл ================

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

Ответ 2

Список инициализации является частью определения конструктора, поэтому вам нужно определить его в том же месте, где вы определяете тело конструктора. Это означает, что вы можете использовать его в своем файле заголовка:

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);

Ответ 3

Список инициализации появляется с определением конструктора, а не с объявлением, которое не является определением. Итак, ваши варианты:

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

в других местах. "В другом месте" разрешено находиться в заголовке, если вы сделаете его inline.

Ответ 4

Не требуется. Он также может быть реализован в исходном файле.

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

Ответ 5

Этот тип инициализации переменной называется списком инициализации членов. Список инициализации члена может использоваться в файле заголовка или исходном файле. Это не имеет значения. Но конструктор должен иметь определение, когда вы его инициализируете в заголовочном файле. Вы можете сослаться на Список инициализации элемента С++ для более подробной информации.