web-dev-qa-db-fra.com

Est-il nécessaire de définir la liste d'initialisation dans un fichier d'en-tête?

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?

30
E235

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

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

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.

8
Steve Jessop

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

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.

0
Arul Kumar