1

我对结构和类有疑问。现在我在结构中定义类,然后将结构创建为节点并将节点推入队列。问题是当我弹出队列时,我创建了接收弹出节点的节点,但节点中的类是一个新类,与推送之前不同。按照代码。

    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;
    }
4

5 回答 5

5

是的,您可以在结构中定义一个类。代码示例不这样做。

于 2012-08-23T14:42:59.277 回答
2

该问题与作为结构成员的类无关。

的构造函数Queue创建一个具有 1 个空白节点的队列。q->push(root)在末尾插入第二个节点。q->pop()返回第一个(空白)节点的副本,而不是您期望的第二个。

于 2012-08-23T14:44:40.943 回答
1

pop 返回一个对象而不是指针。创建了一个新的 queueNode,并从 *aux 复制了它的内容。您应该修改 pop 以返回 queueNode 的指针。

于 2012-08-23T14:43:05.207 回答
1

当你创建 Queue 时,它​​会使用 new 创建一个 queueNode,并默认将其放入 Queue 中。因此,当您调用 pop() 时,它会返回您未使用 create() 配置的默认节点。

我稍微修改了您的代码并让它编译和运行以说明我在上面提出的观点。(注意:它在 VS2010 上编译,如果您使用其他东西,请删除 #include "stdafx.h")

希望这可以帮助您准确了解自己在做什么。

我不建议在您关心的实现中使用下面的代码。仅将其用作学习工具。我建议将您的类声明分离到单独的头文件中,并将实现分离到单独的 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;
    }
于 2012-08-23T14:57:30.160 回答
0

您的推送会将您的节点添加到内部列表的末尾。这不是空的。

标准库有队列、列表和各种漂亮的容器。使用其中之一。

于 2012-08-23T14:41:37.853 回答