C++ 初学者 - 使用结构和常量时遇到问题!

标签 c++ class struct global-variables

我目前正在为一个大学项目开发​​一个简单的拼字游戏。

不过,我无法让它的一部分工作!

检查一下:

我的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

当我比较 charint 时,为什么会出现我正在尝试比较两个 Pos 的错误状态?

我也真的无法放置这些其他错误......

感谢您的宝贵时间!

编辑:

因为我的整个项目都依赖于 Pos,所以我将尝试为它重载 < 运算符...任何人都可以给我一些提示吗?请记住,我是初学者!

最佳答案

#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 , publicclass定义:

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 的排序对象。我不会向初学者推荐这个,因为

  • 运算符重载是一种高级技术,并且
  • 你必须非常小心地定义一致的行为,否则 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完整键入,并将您的电路板表示为二维数组,或 vectorvector秒。它的类型将是 vector<vector<Cell> > . (注意 > > 之间的空格!没有它,这将被解析为右移运算符 >> !)

关于C++ 初学者 - 使用结构和常量时遇到问题!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2812544/

相关文章:

c - 分配给结构中的静态数组时堆缓冲区溢出

c++ - boost 间隔与多精度

c++ - 使用不同的符号表重新计算 Boost Spirit 解析的属性的最有效方法是什么?

excel - 使用类模块在类型内输入

java - 从另一个类访问和更改 jTextField 中的文本

c++ - 结构和类

c - 通过引用将静态二维结构数组传递给函数

c++ - 锁定互斥量与访问磁盘

c++ - 您在 c/c++ 项目中使用指针到指针和/或指针引用最有用的时间是什么时候?

c++ - 在运行时选择类成员的类型