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)最後に2番目のノードを挿入します。q->pop()期待どおりに2番目ではなく、1番目(空白)のノードのコピーを返します。

于 2012-08-23T14:44:40.943 に答える
1

popは、ポインタではなくオブジェクトを返します。新しいqueueNodeが作成され、そのコンテンツが*auxからコピーされます。queueNodeのポインタを返すようにpopを変更する必要があります。

于 2012-08-23T14:43:05.207 に答える
1

キューを作成すると、newを使用してqueueNodeが作成され、デフォルトでキューに入れられます。したがって、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

プッシュすると、ノードが内部リストの最後に追加されます。空ではありません。

標準ライブラリには、キュー、リスト、およびあらゆる種類の優れたコンテナがあります。それらの1つを使用してください。

于 2012-08-23T14:41:37.853 に答える