F. *_* P. 1 c++ struct class global-variables
我目前正在为一个大学项目开发一个简单的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;
}
}
Run Code Online (Sandbox Code Playgroud)
编译时返回的错误:
为什么当我比较chars和ints 时,错误表明我正在尝试比较两个Pos ?
我也真的不能把这些其他错误放在一边......
谢谢你的时间!
编辑:
由于我的整个项目都依赖于Pos,我将尝试重载<operator for it ...任何人都可以给我一些提示吗?请记住,我是初学者!
#define TOTAL_ROWS 15;
#define TOTAL_COLUMNS 15;
Run Code Online (Sandbox Code Playgroud)
这些是预处理程序定义,不能以分号结尾.分号将成为替换文本的一部分,因此编译器会看到(65 + 15;)明显错误的内容.
在C++中,最好使用const变量而不是#defines.在这种情况下,您可以将以下内容放入Board.cpp:
const unsigned int TOTAL_ROWS = 15;
const unsigned int TOTAL_COLUMNS = 15;
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过将它们放入以下内容使它们可用Board.h:
extern const unsigned int TOTAL_ROWS;
extern const unsigned int TOTAL_COLUMNS;
Run Code Online (Sandbox Code Playgroud)
更清洁的是宣称他们是班级成员.把它们放进去Board.cpp:
const unsigned int Board::TOTAL_ROWS = 15;
const unsigned int Board::TOTAL_COLUMNS = 15;
Run Code Online (Sandbox Code Playgroud)
而在Board.hpp,里面的public一节的class定义:
static const unsigned int TOTAL_ROWS;
static const unsigned int TOTAL_COLUMNS;
Run Code Online (Sandbox Code Playgroud)
它们必须是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;
}
Run Code Online (Sandbox Code Playgroud)
另一个(更好)的选择是放弃Pos完全型的,并代表你的板作为二维阵列,或一个vector的vector第 那就是它的类型vector<vector<Cell> >.(注意它们之间的空间> >!没有它,这将被解析为右移运算符>>!)