まず第一に、私が使用している IDE (もしそれが IDE と呼べるなら) は 1992 年の BC 3.1 なので、多くの人はこの質問を避けるかもしれませんし、避けるべきです。
さて、私の問題は、多態的な LinkedList クラスを作成し、エラーなしでコンパイルしたことです。ただし、独自のクラスをそのクラスのヘッダー ファイルのパラメータとして使用して LinkedList オブジェクトを宣言すると、コンパイル エラーが発生Undefined structure
し、Size of 'data' is unknown or zero
. このエラーの背後にある理由はわかっています。クラス パラメータとして IVTEntry を使用して LinkedList オブジェクトを宣言する時点では、オブジェクト IVTEntry のサイズは不明です。
私の質問は、LinkedList をモノモーフィックに変更せずにこのエラーを回避できるかどうかです (IVEntry オブジェクトの T パラメーターを交換します)。これは 1992 年の IDE であり、(少なくとも私の知る限りでは) 独自にコンパイルをスケジュールする機能がないことに注意してください。つまり、プログラム構造に従います。
関連するコードは次のとおりです。
リスト.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
リスト.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