4

「テーブル」と呼ばれる構造体へのポインターの配列があります (構造体はノードと呼ばれます)。

クラスで配列を次のように宣言します。

Node * table;

次に、別の方法でテーブルを初期化します。

this->table = new Node [this->length];

そして、すべてがうまくいきます。this->length は有効なエントリであり、this->table は正しい配列を指している、などです。ただし、要素の値を変更しようとしています。

for(int i = 0; i < this->length; i++) {
    this->table[i] = new Node;
}

あるいは

for(int i = 0; i < this->length; i++) {
    this->table[i] = 0;
}

そして、すべてがバグを起こし始めます。これらのポインターを何かに設定できないのはなぜですか?

これは私が得るエラーです:ここに画像の説明を入力

(15行目は「this->table[i] = new Node;」の行です)。

コードの長いセグメントを投稿するのは嫌いなので、コード自体の短縮バージョンを次に示します。

template <class T, class S>
class HashMap {
    public:
        HashMap();
    private:
        struct Node;
        Node * table;
        static const unsigned length = 100;
};

template <class T, class S>
HashMap<T, S>::HashMap() {
    this->table = new Node [HashMap::length];
    for(int i = 0; i < HashMap::length; i++) {
        this->table[i] = new Node;
    }
}

template <class T, class S>
struct HashMap<T, S>::Node {
    T value;
    S key;
    Node * next;
};

私が行っている調査は、エラーが何であるかを教えてくれません。どんな助けでも大歓迎です!

4

4 に答える 4

4

ポインターの配列がありません。ノードの配列があります。どうやら、あなたが欲しいのは次のようなものです:

Node ** table;
...
this->table = new Node*[this->length];

または、実際にはポインターの配列は必要なく、単にノードの配列が必要な場合もあります。その場合、以下を超える追加の初期化は必要ありません。

this->table = new Node[this->length];

さらに、これが学習演習でない限り、動的配列ハッシュ マップがすべて用意されている標準ライブラリを見てください。

于 2013-08-14T04:37:03.393 に答える
1

tableポインターの配列ではありません。これは s の配列ですNode(または、s の配列を指しNodeます)。の型tableNode*; の種類table[i]Node、ありませんNode*

実際にポインターの配列が必要な場合は、

Node** table;
table = new Node*[length];

またはさらに良いのは、次のようなものです

vector<unique_ptr<Node>> table;
table.resize(length);
于 2013-08-14T04:38:52.663 に答える
0
this->table = new Node [HashMap::length];

this->tableNode*であり、新しい Node [HashMap::length] も Node* を返します。つまり、長さの Node の配列HashMap::lengthが作成され、配列アドレスがthis->tableポインタに格納されます。

this->table[i] = new Node;

例として、次のように定義できます。

int* arr = new int[10];

ここで arr は int* 型ですが、intarr[0]型になります。

同様に、this->table[i]は Node 型であり、新しい Node は Node* を返します。したがって、互換性のない型です。正しい行は

this->table[i] = *new Node;

ただし、ノードの配列は既に作成されており、メモリが割り当てられているため、この行は不要です。コードでこの行を使用すると、メモリ リークが発生します。

于 2013-08-14T09:08:26.903 に答える