Требуется ли определить список инициализации в файле заголовка?
Недавно я создал класс 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) {};
};
он не содержит ошибок. Означает ли это, что список инициализации должен отображаться в файле заголовка?
Ответы
Ответ 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
Этот тип инициализации переменной называется списком инициализации членов. Список инициализации члена может использоваться в файле заголовка или исходном файле. Это не имеет значения. Но конструктор должен иметь определение, когда вы его инициализируете в заголовочном файле. Вы можете сослаться на Список инициализации элемента С++ для более подробной информации.