2013-05-06 3 views
1

У меня есть немного неправильного представления указателей и массивов. Когда я хочу создать массив узлов, мне нужен указатель справа?Как сделать массив узлов?

ли

Node* array; 
array = new Node[size]; 

И, конечно, проблема, когда я хочу, чтобы назначить узел в массив

void Class::enqueue(int newNum) 
{ 

    Node* newNode = new Node(); 
    newNode->value = newNum; 
    newNode->age = 0; 

    if (isFull()) 
     resize(); 
    top++; 
    array[top] = newNode; // ERROR. does this have to be a pointer? 
} 

newNode является указателем, я понимаю. но если я хочу динамически распределять узел, тогда мне придется использовать указатель. Если это так, то как мне назначить узел в массив? Спасибо.

+0

Почему не просто 'станд :: вектор ' ?? Вам действительно нужны указатели и динамически выделенные указатели? –

ответ

1

Вы сказали, что хотите массив узлов, но кажется, что вам действительно нужен массив из указателей для узлов. newNode в вашем коде является указателем, поэтому массив должен иметь возможность удерживать указатели Node. Определите массив как:

Node** array; 
array = new (Node*)[size]; 

Помните, чтобы освободить память, когда он больше не нужен:

delete []array; 

Вы также можете использовать массив Node:

Node* array; 
array = new Node[size]; 

... 
Node *newNode = new Node(); 
... 
array[top] = *newNode; // dereference the pointer 

но вы должны быть осторожны, потому что таким образом содержимое узла будет скопировано в ячейку массива. Тогда будут два отдельных объекта, содержащих одни и те же данные. Вы не можете манипулировать исходным узлом, используя содержимое массива.

Я думаю, что вам действительно нужно массив указателей узлов :) (или, как сказал Билл, вектор указателей: vector<Node*> v;)

+0

Я действительно хочу массив узлов, а не массив указателей на узлы. У меня возникают проблемы, если мне нужна динамически выделенная память для создания нового узла. Если мне нужна динамически распределенная память, мне нужен указатель, не так ли? Спасибо, прежде. –

+0

Если вы хотите иметь доступ к исходным узлам, которые вы динамически создали, вам нужно использовать массив указателей. См. Мое редактирование. –

+0

Спасибо, что отвечает на мой вопрос. –

1
Node* array; 

создает массив Node, он будет хранить объекты Node, как

int* array; 

создает массив, который хранит целые числа. Тем не менее,

Node* newNode = new Node(); 

new возвращает указатель на объект Node, то есть, newNode, при попытке поставить указатель на Node, ожидающей объекты Node, вы получите эту ошибку.

Предположим, что ваш Node класс/структура имеет value и age член, вы можете сделать следующее:

Node newNode(newNum, 0); //^^call your Node's constructor that takes 2 params 
array[top] = newNode; 

поместить объекты Node в свой массив Node. Вы также можете использовать контейнеры STL, чтобы избежать использования динамического массива.

+0

Я понимаю. Я на самом деле пытаюсь создать массив узлов, а не массив узлов указателей. когда динамическое распределение используется для создания узла, то как мне назначить узел в массив? Спасибо –

+0

@LeonardLie см. Мое обновленное сообщение? – taocp

+0

Спасибо, что было полезно. –

1

Если вы можете использовать std::vector, вы можете использовать std::vector<Node*> myvector; (если вы действительно хотите указатели)

Затем вы можете сделать myvector.push_back(new Node(...)); Не забудьте удалить память, иначе вы будете иметь утечек памяти,

Если вы ДНТ заботиться об указателях, просто используйте следующая (гораздо чище, и нет необходимости вручную освободить память)

std::vector<Node> myvector; 
Node node; 
myvector.push_back(node); 
+0

Я думаю, что мне разрешено использовать STL, но я никогда не пробовал его использовать. Я прочитаю документацию по использованию STL –

+0

Удачи! И читайте о различиях между 'arrays' и' vectors' - просто пример - http://www.cplusplus.com/forum/beginner/6321/ – Bill

+0

Спасибо. Это было информативным. –

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