2012-08-23 1 views
1

구조체 및 클래스에 대한 문제가 있습니다. 이제 struct 내부에 클래스를 정의한 다음 구조체를 노드로 만들고 큐를 노드에 푸시합니다. 문제는 팝업 대기열을 수신 할 노드를 생성 할 때 노드의 클래스가 새 것이고 밀어 넣기 전과 같지 않은 경우입니다. 코드를 따르십시오.C++에서 struct 내부에 클래스를 정의 할 수 있습니까?

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

규칙! –

+1

이 코드는 컴파일되지 않기 때문에 명확하게 문제가있는 코드가 아닙니다. 코드의 문제점을 추측하는 것이 가능할 수도 있지만 컴파일하고 실행하여 문제를 보여주는 실제 코드를 게시하면 훨씬 더 나은 해답을 얻을 수 있습니다. –

답변

2

문제는 클래스가 구조체의 멤버 인 것과 관련이 없습니다.

Queue의 생성자는 빈 노드가 1 개인 대기열을 만듭니다. q->push(root)은 끝에 두 번째 노드를 삽입합니다. q->pop()은 2 번째 노드가 아니라 1 번째 노드의 복사본을 반환합니다.

0

푸시를 누르면 내부 목록의 끝에 노드가 추가됩니다. 어느 것이 비어 있지 않습니다.

표준 라이브러리에는 대기열, 목록 및 모든 종류의 멋진 컨테이너가 있습니다. 그 중 하나를 사용하십시오.

5

예, 구조체 내에 클래스를 정의 할 수 있습니다. 코드 샘플은 그렇게하지 않습니다.

+1

+1 그 질문에 대한 유일한 대답 일 것 같습니다. – juanchopanza

1

pop 포인터가 아닌 객체를 반환합니다. 새로운 queueNode가 생성되고 해당 내용이 * aux에서 복사됩니다. pop을 수정하여 queueNode의 포인터를 리턴해야합니다.

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; 
    } 
관련 문제