简体   繁体   中英

Can't get constructor to run

I'm trying to create a doubly linked list where each list has a first node, last node, and num_elements. However, for some reason, when I try to test the code in a UseList.cpp file, I can't get the num_elements to set to zero as default.

Let me show you what I mean:

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

[...]

This is the show method lower down in 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;
}

Note that there is a cout statement there to print the num_elements.

This is the relevant part of UseList.cpp:

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

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

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

When show is called, it prints out "1" and gives me a segmentation fault. Why is num_elements defaulting to "1" instead of "0"?

When I do a cout in List<L>::List() { , nothing is printed... (this implies that the constructor never runs?)

Thanks for the help!

您正在声明一个指向 List<int>指针 ,而不是将其初始化为任何内容。

You have created a pointer to a List<int> object, but no object. So, currently, your program will segmentation fault because the pointer is "dangling". When you try to dereference it with -> , you are accessing memory that isn't yours, and it fails. To fix this, simply allocate a new List object:

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

Don't forget to free it later:

delete list1;

Your other option is to just not use dynamic memory. You shouldn't use it if you don't have to.

List<int> list1;

list1.show()
List<int> *list1;

Declares list1 to be a pointer.

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

Would actually create an instance of List

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM