0

二重連結リストを作成することになっていました。また、リンク リスト関数をテストする CPP ファイル (「test.cpp」ファイル) も提供されています。私が抱えている問題は、A) コンストラクタとデストラクタが何をすべきかわからない、および B) 'ゼロによる除算' エラーがあるため、コンパイラが test.cpp ファイルをコンパイルしないことです。私のリストコンストラクターがリストの「ヘッド」を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 関数(ゼロ除算エラーを取得する関数の 1 つ) の現在の実装です。

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

実際、私はあなたが何を尋ねているのか理解できません。ある種のテストが表示されますが、不一致の場合、テストは「ゼロによる整数除算」例外または特定のプラットフォームに適用されるものを生成することになっています。私見の本当に倒錯した考え。

では、なぜコンパイラはゼロ除算に「気付かない」のでしょうか? 私の知る限り、そうする必要はありません。厳密に言えば、これを行うコードが生成される可能性があります。はい、これは実行時にプロセッサ例外 (割り込み) を生成します。これが作成者の意図である場合、少なくともコンパイラの観点からは、ここに問題はありません。

コンパイラの動作に一貫性がなく、これをコンパイルできる場合があると言いたいのですか?

于 2013-02-08T09:46:25.753 に答える