首先,IDE(如果它可以被称为IDE)我使用的是从1992年开始的BC 3.1,所以很多人可以而且应该避免这个问题。
现在,我的问题是我已经创建了一个多态的LinkedList类,并且它编译时没有错误。但是,如果我将LinkedList对象与我自己的类声明为该类中的一个paremeter'头文件我收到编译错误Undefined structure
和Size of 'data' is unknown or zero
。我知道这个错误背后的原因 - 在使用IVTEntry作为类参数声明LinkedList对象时,对象IVTEntry的大小是未知的。
我的问题是,如果可以避免此错误而不将LinkedList更改为mono-morphic(更换IVTEntry对象的T参数)?请记住,这是1992 IDE,并且它(至少我不知道)没有自己安排编译的能力,即它遵循程序结构。
以下是相关的代码:
LIST.H
#ifndef _LIST_DEF.H_
#define _LIST_DEF.H_
template <class T>
class ListElem {
private:
T data;
ListElem* next;
public:
ListElem(T input);
~ListElem();
void link(ListElem* nextElem);
ListElem* getNext();
};
template <class T>
class LinkedList {
private:
ListElem<T>* head;
int count;
public:
LinkedList(T head);
~LinkedList();
void add(T data);
void add(ListElem(T) node);
void remove(int entry);
ListElem<T>* pop();
ListElem(T>* getHead();
}
#endif
LIST.CPP
#include "list.h"
template <class T>
ListElem<T>::ListElem(T data) {
this->data = data;
}
template <class T>
ListElem<T>::~ListElem() {
delete this->data;
this->next=0;
}
template <class T>
void ListElem<T>::link(ListElem<T>* node) {
this->next = node;
}
template<class T>
ListElem<T>* ListElem<T>::getNext() {
return this->next;
}
template <class T>
LinkedList<T>::LinkedList(ListElem<T>* head) {
this->head = head;
this->head->link(0);
}
template <class T>
LinkedList<T>::LinkedList(T data) {
this->head = new ListElem<T>(data);
this->head->link(0);
}
template <class T>
LinkedList<T>::~LinkedList() {
while(head != 0) {
ListElem<T>* temp = head;
head=head->getNext();
delete temp;
}
}
template <class T>
void LinkedList<T>::add(ListElem<T>* node) {
if(this->head == 0) {
this->head = node;
this->head->link(0);
return;
}
ListElem<T>* current = this->head;
while(current->getNext() != 0) {
//looking for the last one
current = current->getNext();
}
current->link(node);
node->link(0);
}
template <class T>
void LinkedList<T>::remove(int entry) {
if(this->head ==0 || entry < 0) {
return;
}
if(entry == 0) {
ListElem<T>* temp = this->head;
this->head = this->head->getNext();
delete temp;
return;
}
ListElem<T>* current = this->head;
int i = 1;
while(current !=0) {
if(i == entry) {
break;
}
i++;
current = current->getNext();
}
if(i < count) {
if(current->getNext() != 0 && current->getNext()->getNext() != 0) {
ListElem<T>* temp = current->getNext();
current.link(current->getNext()->getNext();
delete temp;
}
}
}
template <class T>
ListElem<T>* LinkedList<T>::pop() {
ListElem<T>* node = head;
if(head != 0) {
head = head->getNext();
}
return node;
}
template <class T>
ListElem<T>* LinkedList<T>::getHead() {
return head;
}
IVT.H
#ifndef _IVT_DEF_
#define _IVT_DEF_
#include "main_eve.h"
class IVTEntry {
friend class MainEvent;
private:
short entryNumber;
MainEvent* event;
void interrupt (*routine)(...);
public:
IVTEntry(short eventNo, void interrupt (*routinedef)(...));
~IVTEntry();
short getEntryNumber();
IVTEntry* getEntry(short eventNo);
void interrupt (*original)(...);
static LinkedList<IVTEntry> *eventList;
};
#endif