2012-08-27 157 views
0

我正在嘗試爲類項目創建一個隊列數組。我已經爲FIFO隊列編寫了規範文件和實現文件。然而,當我寫:如何創建一個隊列數組?

QueType<movieType> fifoQueue[6]; 

我收到此錯誤信息:

錯誤LNK2019:無法解析的外部符號 「公用:__thiscall QueType :: QueType(無效)」?(?? 0 $ QueType @VmovieType @@@@ QAE @ XZ)在函數_main中引用

爲了能夠創建隊列數組,我需要添加什麼?另外,我不能使用STL隊列。

這裏是主文件:

#include "movieType.h" 
#include <iostream> 
#include <fstream> 
#include "QueType.h" 

using namespace std; 

int main() 
{ 
movieType movie[9]; 
ifstream inFile("movie1.txt"); 

    //I get the error here 
    QueType<movieType> fifoQueue[6]; 

    return 0; 
} 

這裏是規範文件:

//definition of NodeType 
template <class ItemType> 
struct NodeType 
{ 
ItemType info; // store data 
NodeType* next; // sotre location of data 
}; 

//exception class used when queue is full 
class FullQueue 
{}; 

//Exception class used when queue is empty 
class EmptyQueue 
{}; 

//templated queue class 
template<class ItemType> 
class QueType 
{ 
public: 
    QueType(); 
    //Function: class constructor 
    //Precondition: none 
    //Postcondition: it initializes the pointers, front and rear to null 

    ~QueType(); 
    //Function:class destructor 
    //Precondition: queue has been initialized 
    //Postcondition: deallocate allocated memory 

    void MakeEmpty(); 
    //Function: determines whether the queue is empty 
    //Precondition: queue has been initialized 
    //Postcondition:queue is empty 

    bool IsEmpty() const; 
    //Function:determines whether the queue is empty 
    //Precondition:queue has been initialized 
    //Postcondition:Function value = (queue is empty) 

    bool IsFull() const; 
    //Function:determines whether the queue is full 
    //Precondition:queue has been initialized 
    //Postcondition:Function value = (queue is full) 

    void Enqueue(ItemType newItem); 
    //Function:Adds newItem to the rear of the queue 
    //Precondition:queue has been initialized 
    //Postcondition:if (queue is full), FullQueue exception is thrown, 
    //else newItem is at rear of queue 

    void Dequeue(ItemType& item); 
    //Function:removes front item from the queue and returns it in item 
    //Precondition:queue has been initialized 
    //Postcondition:if (queue is empty), EmptyQueue exception is thrown 
    //and item is undefines, else front element has been removed from 
    //queue and item is a copy of removed element 

private: 
    NodeType<ItemType>* front; //pointer points to the front to the queue 
    NodeType<ItemType>* rear; // pointer points to the rear of the queue 
}; 

和規範文件:

#include "QueType.h"//gives access to QueType class 
#include <cstddef> //for NULL 
#include <new> // for bad_alloc 

template<class ItemType> 
QueType<ItemType>::QueType() 
{ 
front = NULL; 
rear = NULL; 
} 

template <class ItemType> 
QueType<ItemType>::~QueType() 
{ 
MakeEmpty(); 
} 

template <class ItemType> 
void QueType<ItemType>::MakeEmpty() 
{ 
NodeType<ItemType>* tempPtr;//temporary pointer 

while(front != NULL) 
{ 
    tempPtr=front; 
    front = front->next; 
    delete tempPtr; 
} 
rear = NULL; 
} 

template <class ItemType> 
bool QueType<ItemType>::IsEmpty() const 
{ 
return (front == NULL); 
} 

template <class ItemType> 
bool QueType<ItemType>::IsFull() const 
{ 
NodeType<ItemType>* location; 
try 
{ 
    location = new NodeType<ItemType> 
    delete location; 
    return false; 
} 
catch(std::bad_alloc exception) 
{ 
    return true; 
} 
} 

template <class ItemType> 
void QueType<ItemType>::Enqueue(ItemType newItem) 
{ 
if (IsFull()) 
     throw FullQueue(); 
else 
{ 
    NodeType<ItemType>* newNode; 
    newNode = new NodeType<ItemType>; 
    newNode ->info=newItem; 
    newNode->next=NULL; 
    if(rear== NULL) 
      front= newNode; 
    else 
      rear->next=newNode; 
    rear=newNode; 
} 
} 

回答

1

您需要實現中聲明的功能你的「規格文件」。

此特定錯誤消息只抱怨了QueType構造丟失的實現(因爲這是你正在使用的mainQueType的唯一功能),但只要你開始使用任何的其他的功能,你會得到類似的鏈接器錯誤。

在這種情況下,因爲您的類是模板化的,您需要將您的定義移動到頭文件中,以便編譯器在創建專業化時訪問它們。

欲瞭解更多信息,請參閱this question

+0

我已經添加了實現文件。 – user1561949

+0

@ user1561949答覆已更新。 – Fraser

+0

感謝您的幫助! – user1561949