非内联构造函数中的默认参数

Default Argument in non-inline Constructor

我写了一个单元格class。当我把带有默认参数的构造函数写成内联函数时,没有问题

cell.h
    Class Cell{
    public:
        Cell(int x, int y, char sign='.'):X(x), Y(y), Sign(sign){}  
    };

但是如果我想像这样在我的源文件中移动该实现:

cell.h
        Class Cell{
        public:
            Cell(int x, int y, char sign='.');
        };
cell.cpp
    Cell::Cell(int x, int y, char sign='.'):X(x), Y(y), Sign(sign){}    

编译器说:

Reversi.cpp:1144:43: error: default argument given for parameter 3 of ‘Cell::Cell(int, int, char)’ [-fpermissive]
     Cell::Cell(int x, int y, char sign='.'):X(x), Y(y), Sign(sign){}    
                                           ^
In file included from Reversi.cpp:7:0:
Reversi.h:16:5: note: previous specification in ‘Cell::Cell(int, int, char)’ here
     Cell(int x, int y, char sign='.');    
     ^

您正试图在两个文件中指定默认参数。仅在头文件中执行,编译器将停止抱怨。

cell.h

Class Cell
{
    public:
    Cell(int x, int y, char sign);
};

cell.cpp

Cell::Cell(int x, int y, char sign='.'):X(x), Y(y), Sign(sign)
{
}    

仅在 header 中的 class 定义中的成员函数声明中指定默认参数。否则,包含 header 的所有其他模块将对默认参数一无所知。

您不能在同一个声明区域为同一个参数声明一个默认参数超过一次,编译器对此有说明。

您不能创建两个实现或提供两个版本的默认参数。

您应该在头文件中提供默认参数,并在头文件或相应的 cpp 文件中提供内联实现。

cell.h

#pragma once

class Cell {
public:
  Cell(int x, int y, char sign = '.');

  int X;
  int Y;
  char Sign;
};

cell.cpp

#include "cell.h"

Cell::Cell(int x, int y, char sign): X(x), Y(y), Sign(sign) {}