0

我应该创建一个双向链表。我还获得了一个测试链表函数的 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。我知道我已经发布了很多代码,但我现在有点绝望。任何帮助,将不胜感激!

4

1 回答 1

0

其实我不明白你在问什么。我看到了一种测试,而在不一致的情况下,测试应该生成“整数除以零”异常或适用于特定平台的任何异常。一个非常变态的想法恕我直言。

那么,为什么编译器不“注意到”除以零呢?AFAIK 它不必。严格来说,它可能会生成执行此操作的代码。是的,这会在运行时产生处理器异常(中断),那又如何呢?如果这是作者的意图 - 我在这里没有看到问题,至少从编译器的角度来看。

您是否想说编译器的行为不一致,有时允许编译?

于 2013-02-08T09:46:25.753 回答