Как создать массив указателей в C ++ - PullRequest
1 голос
/ 27 июня 2011

В классе Node:

class Node {
public:
    int data;
    int numchild;  
    Node** nodelist;

    Node(int data, int s);
};

Я хочу массив указателей (nodelist) на другие узлы, у которых есть ребра из этого узла.

Это следующий способпостроить такой массив (и описанный выше способ его объявления) правильным и наилучшим (или самым простым) способом?Если нет, то почему и как лучше?

Node::Node(int d, int s) {
    data = d;
    numchild = s;
    nodelist = new Node*[s];
}

Ответы [ 2 ]

2 голосов
/ 27 июня 2011

Как правило, вы не должны изобретать велосипед.Сырые массивы - почти всегда неправильный путь.Посмотрите на различные контейнеры из STL, то есть std::vector, std::list.Я полагаю, что в вашем случае std::vector может быть лучшим решением.

Если вы хотите придерживаться необработанного массива, быстрое предупреждение: new Node*[s] не инициализирует массив, поэтому содержимое будетбыть неопределенным.Но если вы добавите набор скобок (new Node*[s]()), он будет инициализирован нулем, что хорошо, так как помогает определить, какие записи уже заполнены.

Кроме того, в вашем текущем коде отсутствует деструкторdelete[] список узлов снова.Именно поэтому рекомендуется использовать стандартные контейнеры: у них есть деструкторы, которые сделают всю работу за вас.

1 голос
/ 28 июня 2011

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

Для конструктора используйте базовый список инициализаторов:

Node::Node(int d, size_t s)
: data(d), numchild(s), nodelist(new Node*[s])
{
}

Мы также делаем numchild тип без знака, поскольку он представляет размер.

Но теперь вы также должны позаботиться о том, чтобы освободить память при уничтожении. Простой delete[] не подойдет, потому что сначала нужно пройти через всех детей и рекурсивно освободить их память.

В целом, вектор общих указателей сэкономит вам около 90% кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...