2013-02-27 2 views
0

시스템 : 리눅스 컴파일러 : GCC 버전 프로그램은 강사가에서 사용 할 수있는 기능을 지정하는 대학 수준의 수업을위한 4.4.6문제 큐

제공 클래스. 강사가 제공 한 파일이 아닌 두 파일 만 변경할 수 있습니다. 내 프로그램에서 dequeue 기능을 구현하는 경우를 제외하고 프로그램이 올바르게 작동하는 것 같습니다. 전방, 후방, 물품 및 개수에 접근해야합니다. 컴파일러는 범위를 벗어났다 고 말합니다. 나는 cpp 파일의 다른 함수들로부터 그것들에 접근 할 수 있었지만,이 방법이 다른 방법 때문에 나는 엉망이었다. 내가 찾은 것에서 이것은 함수 포인터입니다. 나는 이전에 이것들을 사용 해본 적이 없으며, 내가 사용할 수있는 유일한 문서는 그들을 사용하는 방법 이었지만, 보내지 않은 함수 외부에서 멤버에 액세스하는 방법에 대해서는 아무것도 아니었다. 이에 대한 도움은 크게 감사 할 것이다. 며칠 동안이 작업을 해왔고 문제를 해결할 방법을 결정할 수 없습니다.

//////////////////////////////////////////////////////////////////////////////////////////// 

//My.h 
#ifndef __LINKEDQUEUE_H__ 
#define __LINKEDQUEUE_H__ 

#include <ostream> 
#include <stdint.h> 
#include "task.h" 
#include "queueExceptions.h" 

#include <string> 
#include <new> 
#include "queue.h" 

/*class QueueEmpty 
{}; 

class QueueFull 
{}; 
*/ 

typedef Task* ItemType; 


struct NodeType { 
    ItemType info; 
    NodeType* next; 
}; 

class LinkedQueue: public Queue 
{ 
public: 
    int count; 
    NodeType* front; 
    NodeType* rear; 


    LinkedQueue(); 

    ~LinkedQueue(); 

    /** 
    * Enqueue a task onto the queue 
    * @param tsk The task to enqueue 
    * @throws QueueFull if there is not room on the queue to place the item. 
    */ 
    void enqueue(Task *tsk) throw (QueueFull); 

    /** 
    * Dequeue an element from the queue. 
    * @return the front of the queue. 
    * @throws QueueEmpty if there are no elements in the queue. 
    */ 
    Task *dequeue() throw (QueueEmpty); 

    /** 
    * Retrieve the current number of items on the queue. 
    * @return the current number of items on the queue. 
    */ 
    size_t depth() const; 


}; 
#endif // __LINKEDQUEUE_H__ 

/////////////////////////////////////////// ///////////////////////////

//my.cpp 

#include <iostream> 
#include <string> 
#include "linkedQueue.h" 

using namespace std; 

LinkedQueue::LinkedQueue() 
{ 
    front = NULL; 
    rear = NULL; 
    count = 0; 
} 

    /** 
    * Enqueue a task onto the queue 
    * @param tsk The task to enqueue 
    * @throws QueueFull if there is not room on the queue to place the item. 
    */ 
    void LinkedQueue::enqueue(Task *tsk) throw (QueueFull) 
{ 
    NodeType* newNode; 
    newNode = new NodeType; 
    if (newNode == NULL) 
    { 
    throw QueueFull(); 
    } 
    else 
    { 
    newNode->info = tsk; 
    newNode->next = NULL; 
    if (rear == NULL) 
    front = newNode; 
    else 
    rear->next = newNode; 
    rear = newNode; 
    count++; 
    } 
} 
    /** 
    * Dequeue an element from the queue. 
    * @return the front of the queue. 
    * @throws QueueEmpty if there are no elements in the queue. 
    */ 
    Task LinkedQueue::*dequeue() throw (QueueEmpty) 
{ 
    if (front == NULL) {throw QueueEmpty();} 
    else 
    { 
    NodeType* tempPtr; 
    tempPtr = front; 
    item = front->info; 
    front = front->next; 
    if (front == NULL) 
     rear = NULL; 
    delete tempPtr; 
    LinkedQueue::count--; 
    return item; 

    } 
} 

    /** 
    * Retrieve the current number of items on the queue. 
    * @return the current number of items on the queue. 
    */ 
    size_t LinkedQueue::depth() const 
{ 
    return count; 
} 

    LinkedQueue::~LinkedQueue() 
{ 
NodeType* tempPtr; 
while (front != NULL) 
    { 
    tempPtr = front; 
    front = front->next; 
    delete tempPtr; 
    } 
rear = NULL; 
} 

//////////////////////////////////////////////////////////////////////////////////////////// 

compile errors: 
g++ -g -o linkedQueue.o -Wall -Werror -c linkedQueue.cpp 
linkedQueue.cpp: In function ‘Task LinkedQueue::* dequeue()’: 
linkedQueue.cpp:46: error: ‘front’ was not declared in this scope 
linkedQueue.cpp:51: error: ‘item’ was not declared in this scope 
linkedQueue.cpp:54: error: ‘rear’ was not declared in this scope 
linkedQueue.h:31: error: invalid use of non-static data member ‘LinkedQueue::count’ 
linkedQueue.cpp:56: error: from this location 
make: *** [linkedQueue.o] Error 1 
+0

환영을 의미한다라고 생각하지 않습니다. 그러한 긴 질문과 과제에 전적으로 부여 된 코드를 게시하려는 경우 아무도 관심을 보이지 않습니다. 대신에 지금까지 발견 한 것과 문제가되는 문제에 대해 정확히 파악하십시오. 또한 게시물의 코드를 편집하여 답변을 원하는 특정 질문과 관련된 섹션 만 표시하십시오. – Tuxdude

답변

0

오타가 있습니다. 이 ...

Task LinkedQueue::*dequeue() 

는 구현이 당신의 헤더가 일치하지 않기 때문에이 컴파일러를 혼동하고 그것이 클래스의 일부 모르는

Task* LinkedQueue::dequeue() 

이어야한다.

편집은 : 또한 item에서 어디 선언,하지만 난 그것을 스택 오버플로 유형의 지역 변수 Task*

+0

나는 그것을 놓쳤다는 것을 믿을 수 없다. 도와 주셔서 대단히 감사합니다 wilsonmichaelpatrick. 나는 그 사람을 위해 계속해서 차기를 할 것이다. –