第一次尝试适当的模块化编程的问题
problems with first attempt at proper modular programming
我第一次尝试模块化编程时遇到了一个问题....
我想知道是否有人能就如何解决这个问题提出一个可能的方向
这是我的代码,再次从Laszlo的书计算几何..我做的唯一不同的事情是把它分成更小的部分和一个单位头文件
header.h
#ifndef NULL
#define NULL 0
#endif
#ifndef A_H
#define A_H
// -----Definition of Node Class ----------------------------------
class Node{
protected:
Node *_prev;
Node * _next;
static int cindex;
public:
int index;
Node(void);
virtual ~Node(void);
Node *next(void); // accessor
Node *prev(void); //accessor
Node *insert(Node*);
Node*remove(void);
void splice (Node*);
};
// ------ end of definition of Node --------------------
//======================================================
//----------Start of Definition of ListNode class ------
template < class T > class List;
template<class T> class ListNode: public Node {
public:
T _val;
ListNode(T val);
friend class List<T>;
};
// ------ End of Definition of ListNode class --------------------
//====================================================++
//----------Start of Definition of List class ------
template<class T> class List {
private:
ListNode<T> *header;
ListNode<T> *win;
int _length;
public:
List(void);
~List(void);
T insert(T);
T append(T);
T prepend(T);
List * append(List*);
T remove(void);
void val(T);
T val(void);
T next(void);
T prev(void);
T first(void);
T last(void);
int length(void);
bool isFirst(void);
bool isLast(void);
bool isHead(void);
};
#endif
node.cpp
#include "header.h"
int Node::cindex=0;
Node::Node(void) :
_next(this), _prev(this)
{index=cindex++;}
Node::~Node(void) {}
Node* Node:: next(void)
{
return _next;
}
Node* Node::prev(void)
{
return _prev;
}
Node *Node::insert(Node*b){
b->_next=_next;
_next->_prev=b;
b->_prev=this;
_next=b;
return b;
}
Node*Node::remove(void)
{
_prev->_next=_next;
_next->_prev=_prev;
_next->_prev=this;
return this;
}
LstNode.cpp
#include "header.h"
template <class T> List <T> :: List(void): _length(0) //constructor for list
{
header =new ListNode<T>(NULL); //mind you this uses the LIstNode class
win=header;
}
template<class T> List <T>::~ List(void) // weird destructor
{
while (length()>0) {
first();remove();
}
delete header;
}
template <class T> T List <T> ::insert(T val)
{
win->insert( new ListNode <T> (val));
++_length;
return val;
}
template <class T> T List <T>::prepend(T val)
{
header->insert(new ListNode <T> (val));
++_length;
return val;
}
template <class T> T List <T>::append(T val)
{
header->prev()->insert(new ListNode <T> (val));
++_length;
return val;
}
template<class T> List <T>* List <T>::append(List<T>*l)
{
ListNode<T> *a =(ListNode<T>*)header->prev();
a->splice(l->header);
_length+=_length;
l->header-remove();
l->_length=0;
l->win=header;
return this;
}
template <class T> void List<T>::val(T v)
{
if (win!=header)
win->_val=v;
}
template <class T> T List<T>::val(void)
{
return win->_val;
}
template <class T> T List <T>:: next(void)
{
win=(ListNode <T>*)win->next();
return win->_val;
}
template <class T> T List <T>:: prev(void)
{
win=(ListNode <T>*)win->prev();
return win->_val;
}
template <class T> T List<T>::first(void)
{
win=(ListNode <T>*)header->next();
return win->_val;
}
template <class T> T List<T>::last(void)
{
win=(ListNode <T>*)header->prev();
return win->_val;
}
template <class T> int List <T>::length(void)
{
return _length;
}
template< class T> bool List <T> ::isFirst(void)
{
return (win==header->next()) &&(_length>0);
}
template< class T> bool List <T> ::isLast(void)
{
return (win==header->prev()) &&(_length>0);
}
template <class T> bool List <T>::isHead(void)
{
return (win == header);
}
experiment.cpp
#include <iostream>
#include "header.h"
int main()
{
List <int> dunder;
dunder.insert(9);
return 0;
}
我首先使用通用命令g++ -o file.cpp
(单独)将所有这些文件转换为目标文件,然后执行g++ output.o output2.o ..
这是我得到的错误:
experiment.o: In function `main':
experiment.cpp:(.text+0x11): undefined reference to `List<int>::List()'
experiment.cpp:(.text+0x22): undefined reference to `List<int>::insert(int)'
experiment.cpp:(.text+0x33): undefined reference to `List<int>::~List()'
experiment.cpp:(.text+0x46): undefined reference to `List<int>::~List()'
collect2: error: ld returned 1 exit status
您需要在同一个文件中定义您的模板类和它的定义。到目前为止,模板类头和定义是不可分离的。
相关文章:
- C++转换参数初始化问题
- 为什么当我解模块化时,这个C++代代码"效率较低"?
- 电源功能模块化操作
- 如何为模块化应用程序实现C++插件系统
- Arduino 模块化编程与全局和设置
- C++:快速模块化指数
- C++部分模板专用化问题
- 运行时C++数组初始化问题
- wxWidgets 拖放文件事件处理程序初始化问题(无效static_cast)
- 为 n 维系统实现模块化龙格-库塔四阶方法
- shared_ptr类的向量的向量初始化问题
- public:静态常量字符串声明/初始化问题
- OpenSSL模块化最大数据类型大小的简单方法
- 显式模板实例化问题
- 为什么C++中的大括号初始化可以解决STL容器的初始化问题
- 程序在没有输入的情况下退出,它有基本的,驱动的类属性初始化问题
- C++隐式/显式模板方法专用化问题
- 模块化算术 - 竞争性编程
- 使用模块化算法将积分器转换为数组时出现问题
- 第一次尝试适当的模块化编程的问题