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

时间:2015-12-05 22:23:30

标签: c++ constructor default-parameters

我写过一个Cell课程。当我使用默认参数编写构造函数作为内联函数时,没有问题

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='.');    
     ^

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

仅在标题中类定义中的成员函数声明中指定默认参数。否则,包含标题的所有其他模块都不会知道默认参数。

您不能在同一声明区域中多次为同一参数声明默认参数,编译器会说明这一点。

答案 2 :(得分:0)

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

您应该在头文件中提供默认参数,并在头文件或对应的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) {}