2013-03-18 59 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]拿到实际的对象而不是它的副本