我有关于struct和class的问题。现在我在struct中定义类,然后我将struct创建为node并在队列中推送节点。问题是当我弹出队列时我创建了接收pop节点的节点,但节点中的类是一个新的,与push之前不同。按照代码。
struct queueNode {
Puzzle puzzle;
queueNode *next;
short lastMove;
};
class Puzzle {
private :
short field[4][4];
short posBlankI;
short posBlankJ;
public :
Puzzle();
bool isFinish();
void print();
void create();
}
class Queue {
private:
queueNode *first, *last;
public:
Queue(){
first = new queueNode;
first->next = NULL;
last = first;
}
~Queue() { delete first; }
bool isEmpty(){ return (first->next == NULL); }
void push(queueNode *aux){
last->next = aux;
last = aux;
}
queueNode pop(){
queueNode *aux = first;
first = first->next;
return *aux;
}
};
//global variable
Queue *q = new Queue();
int main(){
queueNode *root = new queueNode;
root->puzzle.create();
q->push(root);
q->pop().puzzle.print();
return 0;
}
答案 0 :(得分:5)
是的,您可以在结构中定义一个类。代码示例不会这样做。
答案 1 :(得分:2)
该问题与作为结构成员的类无关。
Queue
的构造函数创建一个包含1个空节点的队列。 q->push(root)
在末尾插入第二个节点。 q->pop()
返回第一个(空白)节点的副本,而不是您期望的第二个节点。
答案 2 :(得分:1)
pop返回一个对象而不是一个指针。创建一个新的queueNode,并从* aux复制其内容。您应该修改pop以返回queueNode的指针。
答案 3 :(得分:1)
创建队列时,它会使用new创建一个queueNode,并默认将其放入队列中。因此,当您调用pop()时,它将返回您未使用create()配置的默认节点。
我修改了你的代码并将其编译并运行以说明我在上面的要点。(注意:它在VS2010上编译,删除#include“stdafx.h”如果你使用别的东西)< / p>
希望这可以帮助您准确了解自己在做什么。
我不建议在您关注的实现中使用以下代码。仅将其用作学习工具。我建议将您的类声明分离为单独的头文件,并将实现分离为单独的CPP文件。它有助于整理事物。
输出:
0000
0000
0000
0000
1111
1111
1111
1111
代码:
#include "stdafx.h"
#include <iostream>
class Puzzle {
private :
short field[4][4];
short posBlankI;
short posBlankJ;
public :
Puzzle()
{
for(int i = 0; i<4; i++)
{
for(int j = 0; j < 4; j++)
{
field[i][j] = 0;
}
}
}
bool isFinish();
void print()
{
for(int i = 0; i<4; i++)
{
for(int j = 0; j < 4; j++)
{
std::cout<<field[i][j];
}
std::cout<<std::endl;
}
}
void create()
{
for(int i = 0; i<4; i++)
{
for(int j = 0; j < 4; j++)
{
field[i][j] = 1;
}
}
}
};
struct queueNode {
Puzzle puzzle;
queueNode *next;
short lastMove;
};
class Queue {
private:
queueNode *first, *last;
public:
Queue(){
first = new queueNode;
first->next = NULL;
last = first;
}
~Queue() { delete first; }
bool isEmpty(){ return (first->next == NULL); }
void push(queueNode *aux){
last->next = aux;
last = aux;
}
queueNode pop(){
queueNode *aux = first;
first = first->next;
return *aux;
}
};
//global variable
Queue *q = new Queue();
int main(){
queueNode *root = new queueNode;
root->puzzle.create();
q->push(root);
q->pop().puzzle.print();
q->pop().puzzle.print();
system("Pause");
return 0;
}
答案 4 :(得分:0)
您的推送会将您的节点添加到内部列表的末尾。这不是空的。
标准库包含队列,列表和各种漂亮的容器。使用其中之一。