2010-05-11 46 views
1

我目前正在研究一个大学项目的简单拼字游戏实现。C++初学者 - 使用结构和常量时遇到问题!

虽然我无法得到它的一部分工作!

检查了这一点:

我board.h:

http://pastebin.com/J9t8VvvB

其中的谬误在于子程序:

:在编译时返回

//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; 
    } 
} 

的错误

http://pastebin.com/bZv7fggq

当我比较char s和int s时,错误如何表明我试图比较两个Pos?

我也实在无法把这些其他错误...

感谢您的时间!

编辑:

因为我的整个项目依赖于POS,我要尝试超载<运营商它...谁能给我上的一些技巧?请记住,我是初学者!

+0

的代码在这些错误不匹配,你在这里贴的东西。 – Thomas 2010-05-11 16:38:01

+0

我非常抱歉:(1秒 – 2010-05-11 16:39:00

+0

'temp'是一个结构体,但是你试图把它作为一个数组索引来传递? – 2010-05-11 16:40:18

回答

9
#define TOTAL_ROWS 15; 
#define TOTAL_COLUMNS 15; 

这些是预处理器定义,它们不能以分号结尾。分号将成为替换文本的一部分,因此编译器会看到类似(65 + 15;)这显然是错误的。

在C++中,最好使用const变量而不是#define s。在这种情况下,你可以把下面的你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.hppclass定义的public部分:

static const unsigned int TOTAL_ROWS; 
static const unsigned int TOTAL_COLUMNS; 

他们必须static,因为他们不属于任何特定Board例如,而是整个班级的属性。然后,您可以从Board类外写Board::TOTAL_ROWS


这里的另一个问题是,你正在创建一个map<Pos, Cell>访问它们。map模板要求其密​​钥类型(Pos)上有一个有效的<运算符;在内部,map使用此运算符对它的元素进行排序,因此它可以快速查找。该错误仅在您尝试在地图中查找某些内容时发生;这是由于模板的工作方式所致,所以现在不要打破目标。

一种解决方法是自己重载此操作员以定义对象的排序。我不会推荐给初学者,因为

  • 操作符重载是一种先进的技术,
  • 你必须非常小心地定义一致的行为,否则map星星行为不端,并
  • 如果你这样做,你也应该重载>,<=>===!=

这就是说,这里是代码。这假设两个Pos对象具有相同的xy值被认为是相等的;它没有看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类型,并代表你的板作为二维阵列,或vectorvector。其类型将是vector<vector<Cell> >。 (注意空间> >之间!没有它,这会被解析为右移操作>>!)

+0

谢谢你的回答+建议 我是对不起,您的意思是什么,“通过您的标题可以获得”? -------- 我的整个项目在Pos类型上有其基础...如何超载<对于此特定类型? – 2010-05-11 16:43:22

+1

如果您需要从'Board.cpp'之外访问'TOTAL_ROWS'和'TOTAL_COLUMNS'的值,比如'Main.cpp'或其他任何东西,那么你需要这些声明。如果你只在Board.cpp中使用这些常量',你不必在头文件中声明它们 – Thomas 2010-05-11 16:45:34

+0

谢谢,实际上还有另外一类需要这些常量 – 2010-05-11 16:47:19