我可以在c ++中定义struct里面的类吗?

时间:2012-08-23 14:15:48

标签: c++

我有关于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;
    }

5 个答案:

答案 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)

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

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