2016-10-28 37 views
1

私のコードに問題があります。私はエラーを取得しています「連想配列> ::ノード::ノード(無効)」:削除された関数を参照しようとすると、」ここで削除された関数を参照しようとしています。

は私のクラスは、ここで

template<typename K, typename V> 
class AssociativeArray 
{ 
    public: 
    AssociativeArray(int = 2); // default constructor of a capacity of 2 
    AssociativeArray(){ delete [] data; } 
    AssociativeArray(const AssociativeArray<K,V>&); 
    AssociativeArray<K,V>& operator=(const AssociativeArray<K,V>&); 
    V& operator[](const K&); // getter 
    V operator[](const K&) const; // setter 
    queue<K> keys() const; 
    int size() const {return siz;}; 
    bool containsKey(const K&) const; 
    void deleteKey(const K&); 
    void clear(); 

    private: 
    int cap; 
    int siz; 
    int values; 
    void capacity(int); 
    struct Node{K key; V value; bool inUse;}; 
    Node* data; // data = new Node[cap] 
    void ExpandNode(int,int); 
}; 

であることは私に与えているコンストラクタです問題。

template<typename K, typename V> 
AssociativeArray<K, V>::AssociativeArray(int cap) 
{ 
    this->cap = cap; 
    this->siz = 0; 

    data = new Node[cap]; // ERRORS HERE 

    for (int index = 0; index < cap; index++) 
    { 
    data[index].inUse = false; 
    } 
} 

ここにmainの宣言があります。あなたがNodeの生の配列を作成するときに

AssociativeArray<string, AssociativeArray<string, bool>> seen(10); 
+0

2番目のコンストラクタが配列を削除するのはなぜですか?それはデストラクタではないでしょうか? – silverscania

+0

私は完全にそれを逃した、それはデストラクタであるはずです。 – asmcriminal

+1

@silverscania〜キーが誤動作しているはずです。いくつかのキーボードでそれを入力する必要があります+次の文字またはそれは表示されません。煩わしい。 –

答えて

0

Nodeクラスのデフォルトコンストラクタは、各アイテムに使用されます。

なんらかの理由で、そのようなデフォルトのコンストラクタはありません。おそらくKeyのメンバーにはデフォルトのコンストラクタがありません。しかし、あなたはコードを表示していないので、理由についてはちょうど投機です。

アイテムタイプのデフォルトコンストラクタを呼び出さずに配列を作成する良い方法の1つは、std::vectorを使用することです。あるいは、そうすることが意味がある場合は、単にデフォルトのコンストラクタを定義することができます。しかし、std::vectorを使用すると、他の多くの問題も処理されるため、関係なく処理することをお勧めします。

+0

コメントありがとうございます。私はベクトルを使用することは許されなかったと言いました。しかし、はい、それはより良いでしょう。 – asmcriminal

1

デストラクタがありませんでした。 "AssociativeArray(){delete [] data;}"の前に〜を追加するのを忘れてしまったので、私は2つのコンストラクタがあり、データ配列を削除したコンストラクタを呼び出していると思われます。

関連する問題