programa otro lenguaje incluir headers encabezados ejemplos crear cabeceras cabecera archivos archivo c++ initialization-list

c++ - otro - ¿Es necesario definir la lista de inicialización en un archivo de encabezado?



incluir header en c (5)

Este tipo de inicializar una variable llamada lista de inicialización de miembros. La lista de inicialización de miembros se puede utilizar en el archivo de encabezado o en el archivo de origen. Eso no importa. Pero el constructor debe tener definición al inicializarlo en el archivo de encabezado. Puede consultar la lista de inicialización de miembros de C ++ para obtener más detalles.

Recientemente creé la clase Square :

========= archivo de encabezado ======

class Square { int m_row; int m_col; public: Square(int row, int col): m_row(row), m_col(col) };

========== archivo cpp ======

#include "Square.h" Square::Square(int row, int col) { cout << "TEST"; }

Pero luego recibo muchos errores. Si elimino el archivo cpp y cambio el archivo de encabezado a:

========= archivo de encabezado ======

class Square { int m_row; int m_col; public: Square(int row, int col): m_row(row), m_col(col) {}; };

Cumple sin errores. ¿Significa que la lista de inicialización debe aparecer en el archivo de encabezado?


La lista de inicialización aparece con la definición del constructor, no con una declaración que no es una definición. Por lo tanto, sus opciones son:

Square(int row, int col): m_row(row), m_col(col) {}; // ctor definition

en la definición de clase o bien:

Square(int row, int col); // ctor declaration

en la definición de la clase y:

Square::Square(int row, int col): m_row(row), m_col(col) {} // ctor definition

en otra parte. "En otra parte" se le permite estar en el encabezado, si lo hace en inline .


No es un requisito. También se puede implementar en un archivo fuente.

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


Tu puedes tener

============== archivo de encabezado ================

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


La lista de inicialización forma parte de la definición del constructor, por lo que debe definirla en el mismo lugar donde define el cuerpo del constructor. Esto significa que puedes tenerlo en tu archivo de cabecera:

public: Square(int row, int col): m_row(row), m_col(col) {};

o en el archivo .cpp:

Square::Square(int row, int col) : m_row(row), m_col(col) { // ... }

pero cuando tiene definición en el archivo .cpp, luego en el archivo de cabecera, solo debe haber su declaración:

public: Square(int row, int col);