2013-08-14 4 views
4

У меня есть массив указателей на структуру, называемую «таблица» (структура называется узлом).Невозможно инициализировать массив указателей в C++

Я объявляю массив как это в классе:

Node * table; 

Затем, в другом методе, я инициализировать таблицу:

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

И все работает отлично. this-> длина действительный запись, this-> таблица указывает на правый массив, и т.д. Тем не менее, я пытаюсь изменить значение элементов:

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; 
} 

И все начинается с прослушивания. Почему я не могу установить эти указатели на что-нибудь?

Это ошибка, я получаю: enter image description here

(где линия 15 является линией "this-> таблицы [я] = новый узел;").

Я ненавижу размещать длинные сегменты кода, так вот сокращенный вариант самого кода:

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

У вас нет массива указателей. У вас есть массив узлов. Очевидно, что вы хотите что-то вроде этого:

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

Или, возможно, вы на самом деле не нужен массив указателей, а просто массив узлов. В этом случае никакой дополнительной инициализации не требуется за:

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

Beyond, что, если это не является обучение упражнения, посмотрите на standard library, который имеет dynamic arrays и все hash maps готовы для вас.

1

table не является массивом указателей. Это массив из Node (точнее, он указывает на массив Node). Тип table: Node*; тип table[i]: Node, а не Node*.

Если вы на самом деле хотите, массив указателей, то вам нужно

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

Или еще лучше, что-то вроде

vector<unique_ptr<Node>> table; 
table.resize(length); 
0

Вы не объявили массив указателей.
Узел * таблица (точка к узлу)
Узел ** таблица (точка на массив узлов)

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

this->table имеет тип Node* и нового узла [HashMap :: длина] также возвращает Узел *, т. е. создается массив Узла длины HashMap::length и адрес массива хранится в указателе this->table.

this->table[i] = new Node; 

В качестве примера, мы можем определить:

int* arr = new int[10]; 

Здесь обр имеет тип Int * но arr[0] будет иметь тип Int.

Аналогичным образом, this->table[i] имеет тип Узел и новый узел возвращает узел *. Следовательно, несовместимые типы. Правильная линия будет

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

Но эта линия не нужна, как массив узлов уже создан, и память выделяется. Использование этой строки в коде приведет к утечке памяти.

Смежные вопросы