1
所以我的代碼下面的代碼片段...C++出隊的問題...離隊返回相同的元素反覆
for(int k=0; k<10; k++){
State newState;
newState = queue.dequeue();
//...do stuff with `newState`...
}
我遇到的問題是,測試了幾個小時之後,我意識到,newState
出隊每次代碼到達newState = queue.dequeue()
時,都會出現State
的完全相同的實例,而不是以FIFO方式彈出新元素......我似乎無法弄清楚我究竟做錯了什麼:/
下面是我的隊列類.h和.cpp代碼...
//queue.h
#include <iostream>
#include <stdio.h>
#include "state.h"
using namespace std;
// Node class
class Node {
public:
State elem;
Node* next;
Node() {}
State Elem() { return elem; }
Node* Next() { return next; }
};
// Queue class
class Queue {
Node *head;
Node *tail;
public:
Queue();
~Queue();
bool isEmpty();
int size();
void enqueue(State);
State dequeue();
};
和我的.cpp文件...
//queue.cpp
#include "queue.h"
#include <iostream>
Queue::Queue(){
head = NULL;
tail = NULL;
}
Queue::~Queue(){
if(!isEmpty()){
while(head){
Node *del = head;
head = head->next;
delete del;
}
}
}
bool Queue::isEmpty(){
return head == NULL;
}
int Queue::size(){
int count = 0;
if(isEmpty()){
return count;
} else {
Node *temp = head;
while(temp){
temp = temp->next;
count++;
}
delete temp;
return count;
}
}
//insert s to back of queue
void Queue::enqueue(State s){
Node* newNode = new Node();
newNode->elem = s;
newNode->next = NULL;
if(s.checkZ()){
cout << "Puzzle solved!" << endl << endl;
exit(0);
}
if(head==NULL){
head = tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
//remove State from front of queue
State Queue::dequeue(){
if(isEmpty()){
cout << "This puzzle has no solution." << endl;
cout << "Exiting program..." << endl << endl;
exit(0);
} else {
State ret = head->Elem();
Node *del = head;
head = head->next;
delete del;
return ret;
}
}
在此先感謝您的幫助,我很樂意展示每個請求我的代碼的任何其他片段
編輯:這是我的複製構造國家...
State::State(const State &rhs){
pieces = rhs.pieces;
pieceCount = rhs.pieceCount;
rows = rhs.rows; cols = rhs.cols;
currentState = rhs.currentState;
prevStates = rhs.prevStates;
prevStateCount = rhs.prevStateCount;
moves = rhs.moves;
moveCount = rhs.moveCount;
}
不是你的問題的答案,而是:你的程序邏輯與'Queue'的實現緊密結合。將'Queue'作爲模板類而不是對其進行硬編碼以保存'State's是有意義的。解決這個難題的邏輯也不應該在容器內完成,而應該在使用容器的代碼中完成。如果你將這些東西分開,也許你會發現更容易調試。 – jrok 2013-02-22 10:04:15
我在'Queue'代碼中看不到任何錯誤。也許'State'的拷貝構造函數有問題? – Angew 2013-02-22 10:05:27
是的,我知道。我應該改變這一點。由於這個程序在12小時內到期,所以我開始進行一些編碼馬拉松比賽,所以我開始變得有些sl。。但從我的測試來看,入隊似乎很好。大小應該增加。我認爲這與我分配newState的方式有關,但我不確定... – 2013-02-22 10:07:09