2010-05-11 29 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