【问题标题】:C++ Beginner - Trouble using structs and constants!C++ 初学者 - 使用结构和常量的麻烦!
【发布时间】:2010-05-11 16:35:21
【问题描述】:

我目前正在为一个大学项目做一个简单的拼字游戏实现。

不过,我无法让它发挥作用!

看看这个:

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

当我比较 chars 和 ints 时,为什么会出现错误提示我正在尝试比较两个 Pos?

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

感谢您的宝贵时间!

编辑:

由于我的整个项目都依赖于 Pos,我将尝试为它重载

【问题讨论】:

  • 这些错误中的代码与您在此处粘贴的不匹配。
  • temp 是一个结构,但您试图将其作为数组索引传递?

标签: c++ class struct global-variables


【解决方案1】:
#define TOTAL_ROWS 15;
#define TOTAL_COLUMNS 15;

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

在 C++ 中,最好使用const 变量而不是#defines。在这种情况下,您可以在 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::TOTAL_ROWS 等从 Board 类外部访问它们。


这里的另一个问题是您正在创建一个map&lt;Pos, Cell&gt;map 模板要求其键类型 (Pos) 上定义了有效的 &lt; 运算符;在内部,map 使用此运算符对其元素进行排序,因此它可以进行快速查找。该错误仅发生在您尝试在地图中查找某些内容时;这是由于模板的工作方式造成的,所以现在不要想太多。

一种解决方案是自己重载此运算符以定义Pos 对象的排序。我不建议初学者这样做,因为

  • 运算符重载是一种高级技术,并且
  • 您必须非常小心地定义一致的行为,否则 map 明星行为不端,并且
  • 如果你这样做,你还应该重载&gt;&lt;=&gt;===!=

话虽如此,这里是代码。这假设两个具有相同xy 值的Pos 对象被认为是相等的;它不查看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 类型,并将您的板表示为二维数组,或vectorvectors。那么它的类型就是vector&lt;vector&lt;Cell&gt; &gt;。 (注意&gt; &gt;之间的空格!没有它,这将被解析为右移运算符&gt;&gt;!)

【讨论】:

  • 感谢您的回答+建议。对不起,你是什么意思,“通过你的标题可用”? -------- 我的整个项目都以 Pos 类型为基础...如何为这种特定类型重载
  • 如果您需要从Board.cpp 外部访问TOTAL_ROWSTOTAL_COLUMNS 的值,比如从Main.cpp 或其他什么,那么您需要这些声明。如果只在Board.cpp 中使用这些常量,则不必在标头中声明它们。
  • 谢谢,实际上还有另一个类需要这些常量。
  • 抱歉,我忽略了您评论的第二部分。我添加了更多关于运算符重载技术的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 2014-04-03
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
相关资源
最近更新 更多