2013-03-18 70 views
0

我目前正在編寫C++中的n-puzzle,但由於某些原因,我無法交換板的元素。讓我解釋。我有一個「Piece」類(這個類的一些方法):C++ - 自定義類型不工作的交換功能

Piece::Piece(int l, int c, int n): 
line(l), 
column(c), 
number(n) 
{ 

} 

int Piece::getLine() 
{ 
    return line; 
} 

int Piece::getColumn() const 
{ 
    return column; 
} 

int Piece::getNumber() const 
{ 
    return number; 
} 

void Piece::setLine(const int new_line) 
{ 
    this -> line = new_line; 
} 

void Piece::setColumn(const int new_column) 
{ 
    this -> column = new_column; 
} 

void Piece::setNumber(const int new_number) 
{ 
    this -> number = new_number; 
} 

我也有一個Board類執行遊戲。董事會是一個「片」類型的矢量向量。該板正在創建以下代碼:

for(size_t i = 0; i < this -> width; i++) 
    { 
    vector<Piece> row; 

    for(size_t j = 0; j < this -> height; j++) 
    { 
     row.push_back(Piece(i, j, ((j == this -> width - 1) && (i == this -> height - 1) ? 0 : i * this -> width + j + 1))); 
    } 
    board.push_back(row); 
    } 

沒有什麼是錯的,直到這裏。問題是我想交換董事會的兩個要素。想象一下,我們有一個3x3的遊戲。如果我運行下面的代碼的結果將是錯誤的

swapPieces(board[0][0], board[1][0]); 
swapPieces(board[1][0], board[2][0]); 
cout << board[0][0] << "\t" << board[0][0].getLine() << endl; 

拼圖是正確的:

但是由執行board [0] [0] .getLine()的輸出是1,這是片的初始位置!我真的不知道我做錯了什麼。我會很感激,如果有人能夠給我一個手:)

編輯:swapPieces補充說:

void Board::swapPieces(Piece &p1, Piece &p2) 
{ 
    Piece p = p1; 
    p1 = p2; 
    p2 = p; 
} 
+0

至少,我們需要看到更多的代碼,顯示'board'的確切聲明和定義,以及,當然,'swapPieces'。 – 2013-03-18 17:49:10

+1

問題是你沒有給我們swapPieces函數的代碼,而你知道問題出在這個函數中...... – 2013-03-18 17:51:02

+0

Stephane Rolland:我添加了swapPieces,這是我的錯!抱歉。 – pluralism 2013-03-18 17:52:44

回答

3

代碼庫實際上有兩種方法來表示Piece的位置。一個是Piece對象內的「行」和「列」變量,另一個是板和Vector行容器內的Piece對象的排序。編程的基本原則是幹(不要重複自己)。它會導致錯誤,就像你現在遇到的一樣。 swapPieces可能會交換容器內的對象,但不會更新對象變量。您可以通過使這兩個表示形式一致(設置行和列變量)來將其修補到swapPieces代碼中,但從長遠角度來看,它將更清晰,以確定哪兩個是多餘的。

+0

或者只需像這樣更改'swapPieces':int n = p1.number; p1.number = p2.number; p2.number = n; ' – Roddy 2013-03-18 18:07:49

+0

您的建議代碼可以立即生效,但是如果將其他成員變量添加到Piece,則必須記得再次訪問swapPieces代碼。如果這些變量是受保護的或私人的,那麼你需要更多的工作。另外,可能保留指向遊戲塊的代碼庫的其他部分可能會受到影響。 – Digikata 2013-03-18 18:14:55

+0

那麼,什麼是最好的解決方案來交換板中的兩塊?我現在已經嘗試了setLine()和setColumn()在不同的部分,它的工作,但代碼似乎不可讀。雖然,我接受你的回答:) – pluralism 2013-03-18 18:20:06

0

swapPieces似乎工作,但除非你也呼籲setLinesetColumn的作品將不知道他們已被移動。現在,這些作品將包含它們在構造函數中設置的原始位置。

0

首先確保您的副本c'tor實際上被調用(我還沒有看到實現)。 第二次確認當你把板[0] [0]拿到實際的對象而不是它的副本