我目前正在为大学项目开发一个简单的Scrabble实现。
但是,我无法让它的一部分工作!检查出来:
我的board.h:
错误所在的子程序:
//Following snippet contained in board.cpp
//I believe the function is self-explanatory...
//Pos is a struct containing a char, y, a int, x and an orientation, o, which is not //used in this particular case
void Board::showBoard()
{
Pos temp;
temp.o = 0;
for (temp.y = 'A'; temp.y < (65 + TOTAL_COLUMNS); ++temp.y)
{
for (temp.x = 1; temp-x < (1 + TOTAL_ROWS); ++temp.x)
{
cout << _matrix[temp].getContents();
}
cout << endl;
}
}
编译时返回的错误:
如果我在比较char
s和int
s时错误表明我正在尝试比较两个Pos?
我也真的不能把这些其他错误......
谢谢你的时间!
编辑:
由于我的整个项目依赖于Pos,我将尝试重载&lt;操作员...可以有人给我一些提示吗?请记住,我是初学者!
答案 0 :(得分:9)
#define TOTAL_ROWS 15;
#define TOTAL_COLUMNS 15;
这些是预处理程序定义,不能以分号结尾。分号将成为替换文本的一部分,因此编译器会看到类似(65 + 15;)
的内容,这显然是错误的。
在C ++中,最好使用const
变量而不是#define
。在这种情况下,您可以将以下内容放入Board.cpp
:
const unsigned int TOTAL_ROWS = 15;
const unsigned int TOTAL_COLUMNS = 15;
然后,您可以将它们放在Board.h
:
extern const unsigned int TOTAL_ROWS;
extern const unsigned int TOTAL_COLUMNS;
更清洁的是宣称他们是班级成员。将它们放在Board.cpp
:
const unsigned int Board::TOTAL_ROWS = 15;
const unsigned int Board::TOTAL_COLUMNS = 15;
在Board.hpp
,内 public
定义的class
部分:
static const unsigned int TOTAL_ROWS;
static const unsigned int TOTAL_COLUMNS;
它们必须是static
,因为它们不属于任何特定的Board
实例,而是作为整个类的属性。然后,您可以通过编写Board
等来从Board::TOTAL_ROWS
课程外部访问它们。
此处的另一个问题是您正在创建map<Pos, Cell>
。 map
模板要求其密钥类型(Pos
)上定义了有效的<
运算符;在内部,map
使用此运算符对其元素进行排序,因此可以快速查找。只有在您尝试在地图中查找某些内容时才会发生错误;这是由于模板的工作方式,所以现在不要忽视它。
一种解决方案是自己重载此运算符以定义Pos
对象的排序。我不建议初学者,因为
map
明星行为不端,>
,<=
和>=
,==
和!=
。话虽如此,这是代码。这假定具有相同Pos
和x
值的两个y
对象被视为相等;它没有看o
的值(无论如何,这都是一个奇怪的东西,并且我不知道它用于什么)。
bool operator<(Pos const &l, Pos const &r) {
if (l.y < r.y) return true;
if (l.y > r.y) return false;
if (l.x < r.x) return true;
if (l.x > r.x) return false;
return false;
}
另一个(更好)选项是完全放弃Pos
类型,并将您的电路板表示为二维数组或vector
vector
个。它的类型将是vector<vector<Cell> >
。 (注意> >
之间的空格!没有它,这将被解析为右移运算符>>
!)