尝试实现堆栈时,C ++中的未定义引用

时间:2014-03-03 00:35:14

标签: c++ undefined-reference

这是我的代码。 首先我定义了两个类:

#include <iostream>

using namespace std;

template<class Datatype>
class Node
{
    public:
        Node()
        {
            next = NULL;
            prev = NULL;
        }
        Node* getNext() const
        {
            return next;
        }
        Node* getPrev() const
        {
            return prev;
        }
        Datatype* getData() const
        {
            return &data;
        }
        void changeNext()
        {
            next = NULL;
        }
        void changeNext(Node& nextNode)
        {
            next = &nextNode;
        }
        void changePrev()
        {
            prev = NULL;
        }
        void changePrev(Node& prevNode)
        {
            prev = &prevNode;
        }
        Node* addNext(Node &);
        Node* addPrev(Node &);
        void nodeDel();
        void addData(Datatype &);
    private:
        Node* next;
        Node* prev;
        Datatype data;
};

template<class Datatype>
class Stack
{
    public:
        int push(Datatype &);
        Datatype pop();
        Datatype* peek();
    private:
        Node<Datatype> node;
};

此文件名为my_node.h。某些函数的定义位于另一个文件中,名为my_node.cpp。就像这样:

#include "my_node.h"

using namespace std;

template <class Datatype>
Node<Datatype>* Node<Datatype>::addNext(Node<Datatype>& new_node)
{
    if (next == NULL)
    {
        changeNext(new_node);
        new_node.changePrev(*this);
    }
    else
    {
        Node* next = getNext();
        changeNext(new_node);
        new_node.changePrev(*this);
        next -> changePrev(new_node);
        new_node.changeNext(*next);
    }
    return &new_node;
}

template <class Datatype>
Node<Datatype>* Node<Datatype>::addPrev(Node<Datatype>& new_node)
{
    if (prev == NULL)
    {
        changePrev(new_node);
        new_node.changeNext(*this);
    }
    else
    {
        Node* prev = getPrev();
        changePrev(new_node);
        new_node.changeNext(*this);
        prev -> changeNext(new_node);
        new_node.changePrev(*prev);
    }
    return &new_node;
}

template<class Datatype>
void Node<Datatype>::nodeDel()
{
    if (prev == NULL && next == NULL)
        ;
    else if (prev == NULL)
    {
        Node* next = getNext();
        next -> changePrev();
    }
    else if (next == NULL)
    {
        Node* prev = getPrev();
        prev -> changeNext();
    }
    else
    {
        Node* next = getNext();
        Node* prev = getPrev();
        next -> changePrev(*prev);
        prev -> changeNext(*next);  
    }
    delete this;
    return;
}

template <class Datatype>
void Node<Datatype>::addData(Datatype &new_data)
{
    data = new_data;
}

template <class Datatype>
int Stack<Datatype>::push(Datatype &new_data)
{
    Node<Datatype> *pt_node = new Node<Datatype>;
    if (pt_node == NULL)
        return -1;

    Datatype *pt_data;

    pt_data = (this -> node).getData();
    pt_node -> addData(*pt_data);   
    (this -> node).addData(new_data);

    pt_node -> addNext(this -> node);
}

template <class Datatype>
Datatype Stack<Datatype>::pop()
{
    Datatype temp((this -> node).data);
    Datatype* new_fir = ((this -> node).getNext()) -> getData();
    (this -> node).addData(*new_fir);
    ((this -> node).getNext())->nodeDel();
    return temp;
}

template <class Datatype>
Datatype* Stack<Datatype>::peek()
{
    return (this->node).getData();
}

因此,我在.h文件中声明了类,并在.cpp文件中定义了这些类的一些函数。 现在,我写了一个测试文件来测试它是如何工作的。测试文件test.cpp是这样的:

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

using namespace std;

int main()
{
    Stack<float> test_stack;
    float a = 2.3;
    float b = 3.4;
    test_stack.push(a);
    test_stack.push(b);

    cout << test_stack.pop();
    cout << test_stack.pop();

    return 0;   
}

我使用的命令很简单:

g++ -g -Wall my_node.cpp test.cpp -o test

编译错误如下:

/tmp/ccYaX0on.o: In function `main':
/home/user/cpp/oop_eg/test.cpp:11: undefined reference to `Stack<float>::push(float&)'
/home/user/cpp/oop_eg/test.cpp:12: undefined reference to `Stack<float>::push(float&)'
/home/user/cpp/oop_eg/test.cpp:14: undefined reference to `Stack<float>::pop()'
/home/user/cpp/oop_eg/test.cpp:15: undefined reference to `Stack<float>::pop()'
collect2: ld returned 1 exit status

我觉得很奇怪,因为我定义了所有这些功能。

谢谢, 周凯文

1 个答案:

答案 0 :(得分:2)

使用模板,您通常必须将整个事物(声明定义)放入头文件中。那是因为使用模板的代码需要查看定义才能实例化它。

基本上,您可以将my_node.cpp中的所有函数剪切+粘贴到my_node.h