C++ 我可以在c++;

C++ 我可以在c++;,c++,C++,我对结构和类有问题。现在我在结构内部定义类,然后创建结构作为节点,并在队列中推送节点。问题是,当我弹出队列时,我创建了接收pop节点的节点,但节点中的类是一个新类,与推之前不同。按代码执行 struct queueNode { Puzzle puzzle; queueNode *next; short lastMove; }; class Puzzle { private : short fiel

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

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

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


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

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


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

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

是的,您可以在结构中定义一个类。代码示例不会执行此操作。

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

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

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


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

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


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

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

我对您的代码进行了一些修改,并让它编译和运行,以说明我在上面提出的观点。(注意:它是在VS2010上编译的,如果您使用其他东西,请删除#包括“stdafx.h”)

希望这能帮助你准确地看到你在做什么

我不建议在您关心的实现中使用下面的代码。仅将其用作学习工具。我建议将类声明分离为单独的头文件,将实现分离为单独的CPP文件。它有助于组织事情

输出:

0000
0000
0000
0000
1111
1111
1111
1111
代码:

#包括“stdafx.h”
#包括
班级难题{
私人:
短域[4][4];
短posBlankI;
短posj;
公众:
拼图()
{
对于(inti=0;ipop().puzzle.print();
q->pop().puzzle.print();
系统(“暂停”);
返回0;
}

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

我对您的代码进行了一些修改,并让它编译和运行,以说明我在上面提出的观点。(注意:它是在VS2010上编译的,如果您使用其他东西,请删除#包括“stdafx.h”)

希望这能帮助你准确地看到你在做什么

我不建议在您关心的实现中使用下面的代码。仅将其用作学习工具。我建议将类声明分离为单独的头文件,并将实现分离为单独的CPP文件。这有助于组织工作

输出:

0000
0000
0000
0000
1111
1111
1111
1111
代码:

#包括“stdafx.h”
#包括
班级难题{
私人:
短域[4][4];
短posBlankI;
短posj;
公众:
拼图()
{
对于(inti=0;ipop().puzzle.print();
q->pop().puzzle.print();
系统(“暂停”);
返回0;
}

这显然不是有问题的代码,因为这段代码不会编译。可以猜测代码的问题是什么,但是如果你发布编译、运行并显示问题的真实代码,你会得到更好的答案。这显然不是有问题的代码,因为这段代码不会编译。可能是p猜测代码的问题是可能的,但是如果您发布编译、运行并显示问题的真实代码,您将得到更好的答案。