这是我的代码。 首先我定义了两个类:
#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
我觉得很奇怪,因为我定义了所有这些功能。
谢谢, 周凯文
答案 0 :(得分:2)
使用模板,您通常必须将整个事物(声明和定义)放入头文件中。那是因为使用模板的代码需要查看定义才能实例化它。
基本上,您可以将my_node.cpp
中的所有函数剪切+粘贴到my_node.h
。