Récemment, j'ai créé la classe Square
:
fichier d'en-tête ========= ======
class Square
{
int m_row;
int m_col;
public:
Square(int row, int col): m_row(row), m_col(col)
};
========== fichier cpp ======
#include "Square.h"
Square::Square(int row, int col)
{
cout << "TEST";
}
mais alors je reçois beaucoup d'erreurs. Si je supprime le fichier cpp et modifie le fichier d'en-tête en:
fichier d'en-tête ========= ======
class Square
{
int m_row;
int m_col;
public:
Square(int row, int col): m_row(row), m_col(col) {};
};
il se conforme à aucune erreur. Cela signifie-t-il que la liste d'initialisation doit apparaître dans le fichier d'en-tête?
Vous pouvez avoir
fichier d'en-tête ===============================
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 liste d'initialisationfait partie de definition du constructeur, vous devez donc la définir au même endroit que vous définissez le corps du constructeur . Cela signifie que vous pouvez l'avoir dans votre fichier d'en-tête:
public:
Square(int row, int col): m_row(row), m_col(col) {};
ou dans un fichier .cpp:
Square::Square(int row, int col) : m_row(row), m_col(col)
{
// ...
}
mais quand vous avez la définition dans le fichier .cpp, puis dans le fichier d'en-tête, il ne devrait y avoir que sa déclaration:
public:
Square(int row, int col);
La liste d'initialisation apparaît avec la définition du constructeur, pas avec une déclaration qui n'est pas une définition. Donc, vos options sont soit:
Square(int row, int col): m_row(row), m_col(col) {}; // ctor definition
dans la définition de classe ou bien:
Square(int row, int col); // ctor declaration
dans la définition de classe et:
Square::Square(int row, int col): m_row(row), m_col(col) {} // ctor definition
autre part. "Ailleurs" est autorisé à figurer dans l'en-tête si vous le faites inline
.
Pas une exigence. Il peut également être implémenté dans un fichier source.
// In a source file
Square::Square(int row, int col): m_row(row),
m_col(col)
{}
Ce type d’initialisation d’une variable appelée liste d’initialisation des membres. La liste d'initialisation des membres peut être utilisée dans un fichier d'en-tête ou un fichier source. Cela n'a pas d'importance. Mais le constructeur doit avoir la définition lorsque vous l'initialisez dans le fichier d'en-tête. Vous pouvez vous référer à Liste d'initialisation des membres C++ pour plus de détails.