对基类构造函数的未定义引用

时间:2018-02-05 02:58:14

标签: c++ linked-list g++ linker-errors doubly-linked-list

这是我的代码,用于实现从单个链表继承先前代码的双向链表,我目前在链接器错误方面遇到问题,并在过去一小时内浏览网页寻找问题的答案,到目前为止没有找到任何帮助我。这是我最后一个可以帮助的人吗?

特别是我尝试使用g ++链接我的.o文件时得到的错误是:

DoublyList.o:DoublyList.cpp:(.text+0xf): undefined reference to 
`LinkedList::LinkedList()'
collect2.exe: error: ld returned 1 exit status

我发现问题非常相似,但没有一个答案对我有帮助,或者至少我不知道如何在我的代码中具体实现它们,任何帮助都会被提升。

我的LinkedList类

#ifndef LINKEDLIST_H
#define LINKEDLIST_H

using namespace std;


struct node
    {
        float value;
        node *next;

    };

class LinkedList
{


private:
    node *first;
public:
    LinkedList();
    virtual void insert(float val);
    virtual void del(float val);
    virtual void read();
    virtual int search(float val);


};

#endif

我的LinkedList类定义

#include <iostream>
#include "LinkedList.h"

using namespace std;


LinkedList::LinkedList()
{
    this->first = NULL;
}


void LinkedList::insert(float val)
{

    if(this->first==NULL or this->first->value >= val)
    {
        node* a_node = new node();
        a_node->value = val;
        this->first = a_node;
        return;
    }
    node* n = new node();
    n = this->first;
    node* new_node = new node();
    new_node->value = val;
    while(n->next != NULL and n->next->value < new_node->value)
    {
        n = n->next;
    }
    new_node->next = n->next;
    n->next = new_node;

}


void LinkedList::del(float val)
{
    node* n = this->first;
    node* prev = new node();
    prev = n;//in case if it is the first value
    int i = this->search(val);
    if(this->first->value == val)
    {
        this->first = this->first->next;
        return;
    }

    if(i != -1)
    {
        for(int j = 0; j < i; j++)
        {
            prev = n;
            n = n->next;
        }
    }
    //one last check
    if(n->value == val)
    {
        prev->next = n->next;
    }

}


void LinkedList::read()
{
    node* n = this->first;
    int i = 1;
    while(n != NULL)
    {
        cout << i << ". " << n->value << endl;
        n = n->next;
        i++;
    }
}


int LinkedList::search(float val)
{
    int i = 0;
    node* n = this->first;
    while(n != NULL)
    {
        if(n->value == val)
            return i;
        else
        {
            n = n->next;
            i++;    
        }
    }
    return -1;
}

我的双重课程

#ifndef DOUBLYLIST_H
#define DOUBLYLIST_H

#include "LinkedList.h"

class DoublyList: public LinkedList
{
public:
    struct node
    {
        float value;
        node * next;
        node * prev;
    };
    node * first;
    DoublyList();
    void insert(float val);
    void del(float val);
    void read();
    int search(float val);

};


#endif

我的双重列表定义

 #include <cstddef>
    #include "DoublyList.h"
    #include "LinkedList.h"

    using namespace std;

    //constructor
    DoublyList::DoublyList()
    {
        first = NULL;
    }
    //Insert a node into the correct position in the doubly linked list
    void DoublyList::insert(float val)
    {
    //if linked list is empty or val <= the first node
    if(this->first == NULL or this->first->value >= val)
    {
        node * a_node = new node();
        a_node->value = val;//set node's value
        //begin replacing and assigning pointers
        a_node->next = this->first;
        a_node->prev = NULL;
        this->first = a_node;

        return;
    }
    node * n = new node();
    n = this->first;
    node * new_node = new node();
    new_node->value = val;
    node * prev_node = new node();
    while(n->next != NULL and n->next->value < new_node->value)
    {
        prev_node = n;
        n = n->next;
    }
    prev_node->next = new_node;
    new_node->next = n->next;
    new_node->prev = prev_node;
    n->next = new_node;
    }

    void DoublyList::del(float val)
    {
    node * n = this->first;
    int i = this->search(val);
    //if first node
    if(this->first->value == val)
    {
        this->first = this->first->next;
        this->first->prev = NULL;
        return;
    }
    //if value found
    if(i != -1)
    {
        for(int j = 0; j < i; j++)
        {
            n = n->next;
        }
        //if a middle node
        if(n->value == val and n->next != NULL)
        {
            n->prev->next = n->next;
            return;
        }
        //if last node
        if(n->prev != NULL)
        {
            n->prev->next = n->next;
        }
    }
    return;//value not found so return
    }

void DoublyList::read() {   }
int DoublyList::search(float val) { }

编辑:忘了提到这个错误特别发生在DoublyList.cpp的第8行,这是从以前的试验链接.o文件。 我用来调用链接器的命令是

g++ -g main2.cpp DoublyList.o

其中main2.cpp是包含我测试代码的主函数的代码。

1 个答案:

答案 0 :(得分:0)

感谢xskxzr,解决方案是将LinkedList.o与所有其余的.o文件链接起来。如果有人遇到同样的问题,这就是答案。