另一个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))
{}
代替。谢谢你的帮助!
答案 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)
您无法在头文件(或任何代码)中调用构造函数。