初学者C ++ - 在头文件中使用全局常量时遇到麻烦

时间:2010-05-11 18:01:01

标签: c++ class types global-variables

另一个Scrabble项目问题......这很简单。

似乎我无法识别我的全局常量:

我的board.h: http://pastebin.com/7a5Uyvb8

返回错误:

1>C:\Users\Francisco\Documents\FEUP\1A2S\PROG\projecto3\projecto3\Board.h(34): error:     variable "TOTAL_ROWS" is not a type name
1>      vector< vector<Cell> > _matrix(TOTAL_ROWS , vector<Cell>(TOTAL_COLUMNS));
1>
1>main.cpp
1>compilation aborted for .\Game.cpp (code 2)
1>Board.cpp
1>.\Board.h(34): error: variable "TOTAL_ROWS" is not a type name
1>      vector< vector<Cell> > _matrix(TOTAL_ROWS , vector<Cell>(TOTAL_COLUMNS));
1>                                     ^
1>

为什么会这样?为什么编译器需要类型?

谢谢你的时间!

编辑:

忽略我以前的编辑... 这是我的默认构造函数:     委员会::董事会()     {              _matrix(TOTAL_ROWS,vector(TOTAL_COLUMNS));     }

我收到以下错误。

1>.\Board.cpp(16): error: call of an object of a class type without appropriate operator() or conversion functions to pointer-to-function type
1>       _matrix(TOTAL_ROWS, vector<Cell>(TOTAL_COLUMNS));
1>       ^

为什么会这样?


我设法解决了我的文件的所有问题。我用了

Board::Board() :
     _matrix(TOTAL_ROWS, vector<Cell>(TOTAL_COLUMNS))
     {}

代替。谢谢你的帮助!

5 个答案:

答案 0 :(得分:4)

编写的方法是,您定义了一个名为_matrix的函数,它返回一个向量。所以TOTAL_ROWS应该是一个类型名称,因为它被解析为一个参数类型。我假设你要做的是定义一个名为_matrix的变量,一个向量。

您要做的是取消构造函数,并在构造函数中初始化变量。只有常量积分值才能在类的主体中初始化,至少在当前版本的标准中是这样。

离开不重要的部分:

  Board() : _matrix(TOTAL_ROWS, vector<Cell>(TOTAL_COLUMNS)) { }

private:
  vector< vector<Cell> > _matrix;

请注意,这只是一个例子。大概你有一个实际文件,其实际主体为Board(),你应该把初始化放在那里而不是直接放在标题中,否则你会得到错误。重要的是,当你最初声明_matrix时,你不应该这样做。


对于您的新问题,每次Board.h包含在文件中时,extern const unsigned int TOTAL_COLUMNS = 15;都会定义TOTAL_COLUMNS。默认情况下,命名空间范围内的常量变量具有内部链接,因此如果您不使用extern,则可以。

通常,如果变量不是常量,则采用与_matrix类似的方法。你在标题中省略了初始化,然后在实现文件中重新开启:

board.h:     extern const int TOTAL_COLUMNS;

board.cpp:     extern const int TOTAL_COLUMNS = 15;

答案 1 :(得分:2)

你试图在它的定义上初始化向量,这不是对象变量执行此操作的正确方法,正确的方法是:

extern const unsigned int TOTAL_ROWS = 15;
extern const unsigned int TOTAL_COLUMNS = 15;
class Board
{
public:
        Board() : _matrix(TOTAL_ROWS, vector<Cell>(TOTAL_COLUMNS)) {}
private:
        vector< vector<Cell> > _matrix;
};

答案 2 :(得分:1)

在您的标题文件中,我看到:

private:
    vector< vector<Cell> > _matrix(TOTAL_ROWS , vector<Cell>(TOTAL_COLUMNS));

这似乎是声明一个私有成员变量_matrix,显然是同时调用_matrix的构造函数。你不能以这种方式调用构造函数。

请记住,您的头文件可能包含在MANY程序文件中。 因此,标头不应包含执行指令(存在某些例外,例如内联方法和模板)。您永远不会知道标头的位置,因此您永远不会知道标头文件中的代码将出现在何处。

编写头文件是一个很好的建议,这样可以安全地将包含在中。

如果您想继续此代码,我建议: Board()的构造函数应该显式构造成员变量:

Board::Board() :
    _matrix(TOTAL_ROWS, .....);
    // This will call the matrix constructor ONLY when the Board constructor is called.
{
}

然后应该调用Board构造函数,但只能在.cpp文件中调用,而不是在.h文件中。

答案 3 :(得分:1)

  

这是我的默认构造函数:

     

Board :: Board(){_ matrix(TOTAL_ROWS,   矢量(TOTAL_COLUMNS)); }

     

我收到以下错误。 [....]

您没有按照@Dennis Zickefoose,@ KillianDS和我自己提供的示例和语法进行操作。

请重新阅读我们的答案并研究我们的代码。

答案 4 :(得分:0)

您无法在头文件(或任何代码)中调用构造函数。