我应该创建一个双向链表。我还获得了一个测试链表功能的CPP文件('test.cpp'文件)。我遇到的问题是A)我不知道我的构造函数和析构函数应该做什么,以及B)编译器不编译test.cpp文件,因为它有'除以零'错误,当当我的List构造函数将列表'head'初始化为NULL时,它正在编译它。
以下是链接列表中节点的代码:
template <class T>
struct ListItem
{
T value;
ListItem<T> *next;
ListItem<T> *prev;
ListItem(T theVal)
{
this->value = theVal;
this->next = NULL;
this->prev = NULL;
}
};
通用列表类如下:
template <class T>
class List
{
ListItem<T> *head;
public:
// Constructor
List();
// Copy Constructor
List(const List<T>& otherList);
// Destructor
~List();
void insertAtHead(T item);
};
以下是我目前的构造函数,析构函数和insertAtHead函数的实现(其中一个函数得到除零错误)。
template <class T>
List<T>::List()
{
head->value=0;
}
template <class T>
List<T>::~List()
{
ListItem<T> *temp, *temp2;
temp=head;
if(head->next==NULL)
{
delete head;
}
else
{
while(temp->next!=NULL)
{
temp=temp->next;
temp2=temp->prev;
delete[] temp2;
}
delete [] temp;
delete [] head;
}
}
template <class T>
void List<T>::insertAtHead(T item)
{
ListItem<T>* a = new ListItem<T>(item);
if(head->next==NULL && head->value=0)
{
head=a;
}
else
{
head->prev=a;
a->next=head;
head=a;
}
}
最后,这里是测试insertAtHead 的函数,它包含除零。
void test_list_insert_head()
{
lasttotpoints = 5;
List<int> l;
for (int i = 0; i < 25000; i++)
{
l.insertAtHead(i);
ListItem<int> *tmp = l.getHead();
int k = i;
while (tmp != NULL)
{
if (tmp->value != k)
int a = 1/0;
k--;
tmp = tmp->next;
}
}
cout << ".";
lastpoints += 5;
}
为什么编译器之前没有注意到除零,我的构造函数和析构函数到底应该做什么? 谢谢。 PS。我知道我发布了很多代码,但此刻我有点绝望。任何帮助将不胜感激!
答案 0 :(得分:0)
其实我不明白你的要求是什么。我看到了一种测试,而在不一致的情况下,测试应该生成“整数除零”异常或适用于特定平台的任何异常。一个真正变态的想法恕我直言。
那么,为什么不编译器“注意”除以零?它没有AFAIK。严格来说,它可能会生成执行此操作的代码。是的,这会在运行时生成处理器异常(中断),那又怎样呢?如果这是作者的意图 - 我在这里看不到问题,至少从编译器的角度来看。
您是否试图说编译器行为不一致,有时允许编译?