是否需要在头文件中定义初始化列表?

E23*_*235 39 c++ initialization-list

最近我创建了课程Square:

=========头文件======

class Square
{
    int m_row;
    int m_col;

public:
    Square(int row, int col): m_row(row), m_col(col) 
};
Run Code Online (Sandbox Code Playgroud)

========== cpp文件======

#include "Square.h"

Square::Square(int row, int col)
{
    cout << "TEST";
}
Run Code Online (Sandbox Code Playgroud)

但后来我收到很多错误.如果我删除cpp文件并将头文件更改为:

=========头文件======

class Square
{
    int m_row;
    int m_col;

public:
    Square(int row, int col): m_row(row), m_col(col) {};
};
Run Code Online (Sandbox Code Playgroud)

它没有错误.这是否意味着初始化列表必须出现在头文件中?

Lih*_*ihO 56

初始化列表是构造函数定义的一部分,因此您需要在定义构造函数体的同一位置定义它.这意味着您可以在头文件中使用它:

public:
    Square(int row, int col): m_row(row), m_col(col) {};
Run Code Online (Sandbox Code Playgroud)

或者在.cpp文件中:

Square::Square(int row, int col) : m_row(row), m_col(col) 
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

但是当你在.cpp文件中定义时,那么在头文件中,应该只有它的声明:

public:
    Square(int row, int col);
Run Code Online (Sandbox Code Playgroud)


uba*_*uba 36

你可以有

==============头文件================

class Square
{
    int m_row;
    int m_col;

public:
    Square(int row, int col);
};
Run Code Online (Sandbox Code Playgroud)

================== cpp ====================

Square::Square(int row, int col):m_row(row), m_col(col) 
{}
Run Code Online (Sandbox Code Playgroud)

  • 没有_explain_问题以及为什么这会解决它. (7认同)
  • @underscore_d初始化列表是**定义**的一部分,因此您必须将列表放在使用definition/body/**{}**的位置 (4认同)

Ste*_*sop 8

初始化列表与构造函数定义一起出现,而不是与非定义的声明一起出现.所以,你的选择是:

Square(int row, int col): m_row(row), m_col(col) {}; // ctor definition
Run Code Online (Sandbox Code Playgroud)

在类定义中,否则:

Square(int row, int col); // ctor declaration
Run Code Online (Sandbox Code Playgroud)

在类定义中:

Square::Square(int row, int col): m_row(row), m_col(col) {} // ctor definition
Run Code Online (Sandbox Code Playgroud)

别处.如果你做的话,"Elsewhere"被允许在标题中inline.