牛人请进(请帮帮忙)

herohowk 2001-03-01 11:39:00
我自己用模板写了一个连表结构,但在proj中却无法使用, 在workspace中的方法全部消失, 我看了看cList的原码, 但没有解决问题, 是能告诉我关键之所在!附代码如下:

/************************************************************
List.h
************************************************************/
//ListElement<T> class define
#include "afxtempl.h"
template <class T>
class LinkedList;

template <class T>
class ListElement
{

private:
T data;
ListElement* pNext;
//
ListEelment(const T&, ListElement*);

public:
const T& GetData() const;
const ListElement* GetNextNode() const;
//
friend LinkedList<T>;
};
/////////////////////////////////////////////
//ListElement<T> 的实现
template <class T>
ListElement<T>::ListEelment(const T& _data, ListElement<T>* _pNext)
{
data = _data;
pNext = _pNext;
}

template <class T>
const T& ListElement<T>::GetData() const
{
return data;
}

template <class T>
const ListElement<T>* ListElement<T>::GetNextNode() const
{
return pNext;
}
///////////////////////////////////////////////////////////////////////
//LinkedList<T> class define
template <class T>
class LinkedList
{

private:
ListElement<T>* pHead;
ListElement<T>* pTail;

public:
LinkedList();
~LinkedList();

LinkedList(LinkedList const&);
LinkedList& operator = (LinkedList const&);

const ListElement<T> * GetHeadNode() const;
const ListElement<T> * GetTailNode() const;
BOOL IsEmpty() const;
const T& GetFirst() const;
const T& GetLast() const;

void Prepend(const T&);
void Append(const T&);
void Extract(const T&);
void Purge();
void InsertAfter(const ListElement<T>*, const T&);
void InsertBefore(const ListElement<T>*, const T&);
};
///////////////////////////////////////////////////////////////////////





///////////////////////////////////////////////////////////////////////
//LinkedList<T> 的实现
template <class T>
LinkedList<T>::LinkedList()
{
pHead = NULL;
pTail = NULL;
}

template <class T>
void LinkedList<T>::Purge()
{
while(pHead != NULL)
{
ListElement<T>* tmp = pHead;
pHead = pHead->pNext;
delete tmp;
}
pTail = NULL;
}

template <class T>
LinkedList<T>::~LinkedList()
{
Purge();
}

template <class T>
const ListElement<T>* LinkedList<T>::GetHeadNode() const
{
return pHead;
}

template <class T>
const ListElement<T>* LinkedList<T>::GetTailNode() const
{
return pTail;
}

template <class T>
BOOL LinkedList<T>::IsEmpty() const
{
return (pHead == NULL);
}

template <class T>
const T& LinkedList<T>::GetFirst() const
{
if(pHead == NULL)
throw domain_error("list is empty");
return pHead->data;
}

template <class T>
const T& LinkedList<T>::GetLast() const
{
if(pTail == NULL)
throw domain_error("list is empty");
return pTail->data;
}
template <class T>
void LinkedList<T>::Prepend(const T& item)
{
ListElement<T>* tmp = new ListElement<T> (item, pHead);
if(pHead == NULL)
pTail = tmp;
pHead = tmp;
}

template <class T>
void LinkedList<T>::Append(const T& item)
{
ListElement<T>* tmp = new ListElement<T>(item, NULL) ;
if(pHead == NULL)
{
pHead = tmp;
}
else
{
pTail->pNext = tmp;
}
pTail = tmp;
}

template <class T>
LinkedList<T>::LinkedList(const LinkedList<T>& linkedList)
{
pHead = NULL;
pTail = NULL;
const ListElement<T>* ptr;
for(ptr = linkedList.pHead; ptr != NULL; ptr = ptr->pNext)
Append(ptr->data);
}

template <class T>
LinkedList<T>& LinkedList<T>::operator =(const LinkedList<T>& linkedList)
{
if(&linkedList != this)
{
Purge();
const ListElement<T>* ptr;
for(ptr = linkedList.pHead; ptr != NULL; ptr = ptr->pNext)
Append(ptr->data);
}
return *this;
}

template <class T>
void LinkedList<T>::Extract(const T& item)
{
ListElement<T>* ptr = pHead;
ListElement<T>* prevPtr = NULL;

while(ptr != NULL && ptr->data != item)
{
prevPtr = ptr;
ptr = ptr->pNext;
}

if(ptr == NULL)
throw invalid_argument("item not found");

if(ptr == pHead)
pHead = ptr->pNext;
else
prevPtr->pNext = ptr->pNext;

if(ptr == pTail)
pTail = prevPtr;

delete ptr;
}

template <class T>
void LinkedList<T>::InsertAfter(const ListElement<T>* arg, const T& item)
{
ListElement<T>* ptr = const_cast<ListElement<T>*> (arg);
if(ptr == NULL)
throw invalid_argument("invalid position");
const ListElement<T>* tmp = new ListElement<T> (item, ptr->pNext);
ptr->pNext = tmp;
if(pTail == ptr)
pTail = tmp;
}

template <class T>
void LinkedList<T>::InsertBefore(const ListElement<T>* arg, const T& item)
{
ListElement<T>* ptr = const_cast<ListElement<T>*> (arg);
if(ptr == NULL)
throw invalid_argument("invalid position");
const ListElement<T>* tmp = new ListElement<T> (item, ptr);
if(pHead == ptr)
pHead = tmp;
else
{
ListElement<T>* prevPtr = pHead;
while(prevPtr != NULL && prevPtr->pNext != ptr)
prevPtr = prevPtr->pNext;
if(prevPtr == NULL)
throw invalid_argument("invalid position");
prevPtr->pNext = tmp;

}
}
...全文
117 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
FMD 2001-03-04
  • 打赏
  • 举报
回复
不是VC的 BUG 吧!!! ,CPP是要生成OBJ的,模板的实现中,数据类型都还不确定,如何先编译成OBJ, 自然不能放在CPP中了,而且所提问题中,没有涉及到CPP啊
workspace对模板的支持是不好,经常看不到成员,不过,这没什么关系啊
Sam_Yang 2001-03-04
  • 打赏
  • 举报
回复
因为,模板的实现并不分配内存,看《think in c++》
zzh 2001-03-03
  • 打赏
  • 举报
回复
VC有这个BUG,你把你的模板里的实现文件跟头文件都放在头文件当中,然后就可以使用了。至于具体为什么要这样做,我也说不清楚,只知道,这样做是可以行得通的。
也就是说,你把List.h跟List.cpp都放在List.h当中,然后在项目中只要包括List.h就可以了
malloc 2001-03-03
  • 打赏
  • 举报
回复
I suggest u to study the source code of CList more carefully.
If u give me some score for grating, I will tell u the solution.

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧