Не удается запустить конструктор - PullRequest
1 голос
/ 23 октября 2011

Я пытаюсь создать двусвязный список, в котором у каждого списка есть первый узел, последний узел и num_elements. Однако по какой-то причине, когда я пытаюсь протестировать код в файле UseList.cpp, я не могу получить значение num_elements равным нулю по умолчанию.

Позвольте мне показать вам, что я имею в виду:

В List.h:

template <class L>
class List
{
   private:
        Node<L> *first;
        Node<L> *last;
        int num_elements;
   public:
        // constructors and destructors
        List();
    [...]
}

[...]

template <class L>
List<L>::List() {
    first = NULL;
    last = NULL;
   num_elements = 0;
}

[...]

Это метод show, расположенный внизу в list.h:

template <class L>
// Print out the data in each node separated by a space.
void List<L>::show() {
    cout << num_elements << endl;
    Node<L> *current_node = first;
    while (current_node != NULL) {
       cout << current_node->data << " ";
       current_node = current_node->next;
    }
    cout << endl;
}

Обратите внимание, что там есть оператор cout для вывода num_elements.

Это соответствующая часть UseList.cpp:

int main (int argc, char *argv[]) {
    cout << "-----------------------------------------" << endl;
    cout << "----------------LIST ONE-----------------" << endl;
    cout << "-----------------------------------------" << endl;

    List<int> *list1;
    srand(time(NULL));

    list1->show();
[...]

Когда вызывается show, он печатает «1» и выдает ошибку сегментации. Почему для num_elements по умолчанию используется значение «1» вместо «0»?

Когда я делаю cout в List<L>::List() {, ничего не печатается ... (это означает, что конструктор никогда не запускается?)

Спасибо за помощь!

Ответы [ 3 ]

3 голосов
/ 23 октября 2011

Вы объявляете указатель на List<int> и не инициализируете его ни к чему.

2 голосов
/ 23 октября 2011

Вы создали указатель на объект List<int>, но без объекта. Итак, в настоящее время ваша программа будет иметь ошибку сегментации, потому что указатель «висят». Когда вы пытаетесь разыменовать его с помощью ->, вы получаете доступ к памяти, которая не принадлежит вам, и она не работает. Чтобы это исправить, просто выделите новый объект List:

List<int> *list1 = new List<int>();

Не забудьте освободить его позже:

delete list1;

Другой вариант - просто не использовать динамическую память. Вы не должны использовать его, если вам не нужно.

List<int> list1;

list1.show()
0 голосов
/ 23 октября 2011
List<int> *list1;

Объявляет list1 указателем.

List<int> *list1 = new List<int>();

Фактически создаст экземпляр List

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