2011-06-19 55 views
4

STLを使用せずに配列のリンクリストを作成しようとしています。しかし、私はリンクリストに配列を渡すことが困難です...C++ "利用可能なデフォルトコンストラクタがありません"

上記のエラーが発生します。配列をリンクされたリストに渡す必要がありますか?ありがとう! (問題のコードは**でマークされているテストの場合は、削除してください。)

SinglyLinkedList.h

#pragma once 

#ifndef SinglyLinkedList_h 
#define SinglyLinkedList_h 

#include<iostream> 

template <typename Type> 
struct node 
{ 

    Type value; 
    node *next; 
}; 

template <typename Object> 
class SinglyLinkedList 
{ 

private: 
    node<Object> *head; 

public: 
    SinglyLinkedList(); 
    ~SinglyLinkedList(); 
    bool insert(Object x); 
    bool empty(); 
}; 

template <typename Object> 
SinglyLinkedList<Object>::SinglyLinkedList() 
{ 
    this->head = NULL; 
} 

template <typename Object> 
bool SinglyLinkedList<Object>::insert(Object x) 
{ 
    node<Object> *temp = new node<Object>; 
    temp->value = x; 
    temp->next = NULL; 

    if (this->head==NULL) 
    { 
     this->head = temp; 
    } 
    else 
    { 
     node<Object> *S = this->head, *P = S; 

     while ((S->value < temp->value)&&(S != NULL)) 
     { 
      S = S->next; 
      P = S; 
     } 
     if(S == NULL) 
      temp->next = P; 
     else 
     { 
      temp->next = S; 
      P->next = temp; 
     } 
    } 
    return true; 
} 

template <typename Object> 
bool SinglyLinkedList<Object>::empty() 
{ 
    if(this->head == NULL) 
     return true; 
    else 
     return false; 
} 

template <typename Object> 
SinglyLinkedList<Object>::~SinglyLinkedList() 
{ 
    delete this->head; 
} 

#endif 

DynamicArrayClass.h

#pragma once 

#ifndef DynamicArrayClass_h 
#define DynamicArrayClass_h 
#include<iostream> 

template <class T> 
class DynamicArrayClass 
{ 
private: 
    T *array; 
    int size, numItems; 

public: 
    DynamicArrayClass(int newSize) 
    { 
     size = newSize; 
     numItems=0; 
     array = new T[size]; 
    } 

    int GetSize(){ return size;} 
    int GetNumItems() const { return numItems; } 
    bool isEmpty() const { return numItems==0; } 
    bool isFull() const { return numItems==size; } 
    bool addItem (const T &object) 
    { 
     if(isFull()) 
     { 
      return false; 
     } 
     else 
     { 
      array[numItems++] = object; 
      return true; 
     } 
    } 
    const T& getItem(int index) {return array[index];} 
    void makeEmpty() 
    { 
     numItems = 0; 
    } 

    ~DynamicArrayClass() 
    { 
     if(array !NULL) 
      delete [] array; 
    } 


}; 

#endif 

main.cppに

#include "DynamicArrayClass.h" 
#include "SinglyLinkedList.h" 
#include "stopwatch.h" 

#include<iostream> 

int main() 
{ 
    int totalCapacity = 0; 
    int arrayAddSize = 0; 
    while(totalCapacity < 10000) 
    { 
     if(totalCapacity==0) 
     { 
      DynamicArrayClass<int> *array1 = new DynamicArrayClass<int>(25); 
      totalCapacity = 25; 
      SinglyLinkedList<DynamicArrayClass<int>> *list = new SinglyLinkedList<DynamicArrayClass<int>>(); 

      for(int i = 0; i<25; i++) 
      { 
       array1->addItem(1); 
      }  
      **list->insert(*array1);** 
     } 
     else 
     { 
      arrayAddSize = (totalCapacity/2); 
      totalCapacity = totalCapacity + arrayAddSize; 
      DynamicArrayClass<int> *array = new DynamicArrayClass<int>(arrayAddSize); 
      SinglyLinkedList<DynamicArrayClass<int>> *list = new SinglyLinkedList<DynamicArrayClass<int>>(); 
      for(int i=0; i <arrayAddSize; i++) 
      { 
       array->addItem(1); 
      } 
     } 

    } 
    return 0; 
} 
+3

私たちにダンプするコードはたくさんありますが、宿題タグを尋ねることなく+1するのは+1です。 –

答えて

4

問題はこの部分のinsertです:

node<Object> *temp = new node<Object>; 

nodeには、Objectが含まれています。それを構築するには、Objectにデフォルトのコンストラクタが必要です。

nodeに、保存しなければならない値をコピーするコンストラクタを追加することはできますか?それは例えば、それを作るでしょう:

node<Object> *temp = new node<Object>(x, NULL); 
4
node<Object> *temp = new node<Object>; 

この行をSinglyLinkedList::insertに私が想定し、エラーが発生します。 Type value;new node<Object>呼び出しによって構築デフォルトになることを

template <typename Type> 
struct node 
{ 
    Type value; 
    node *next; 
}; 

:問題は、あなたのnode構造体は、このようになっていること、です。 node構造体に適切なコンストラクタを指定してください。

+0

+1は正しい、そして明確な説明です。 – Nawaz

関連する問題