(急)类的编程
我是个菜鸟,我想实现一个类似与TStringList的类,不同的是我的类用的是WideString不是AnsiString;有没有高手赐教一下啊!! 问题点数:30、回复次数:8Top
1 楼smellteen(仰天)回复于 2005-04-20 16:01:15 得分 1
AnsiString::WideChar
这个函数不是可以把ansistring转换成一个wide-character array么?
还有必要去另外实现一个么?Top
2 楼NetSpider9804040(网络蛛蛛)回复于 2005-04-20 17:36:18 得分 1
对啊,可以转换的啊,何需重写!Top
3 楼jklee(飞)回复于 2005-04-21 15:36:54 得分 0
哦 ~~~
具体要怎么写啊~~ 没写过啊Top
4 楼jklee(飞)回复于 2005-04-21 15:47:46 得分 0
比如我想吧一个WideString的值放到TStringList中要怎么做啊? 好像不行啊Top
5 楼songhtao(三十年孤独)回复于 2005-04-21 15:58:35 得分 1
比如我想吧一个WideString的值放到TStringList中要怎么做啊? 好像不行啊
转换成AnsiString放进去,取出来后再转回WideString满足特殊要求。Top
6 楼jklee(飞)回复于 2005-04-21 16:09:52 得分 0
转换成AnsiString放进去,取出来后再转回WideString满足特殊要求。
这样不行啊,我把一个特殊字符放进去出来就成"?"了Top
7 楼Waiting4you(毛毛)回复于 2005-04-22 09:38:03 得分 20
看来要自己编链表了:(
这是偶编的链表模版类,没经过严格测试,不过现在用用还行
#ifndef TDataList_HPP
#define TDataList_HPP
template <class T> class TDataList
{
private:
typedef struct TI{
T Data;
struct TI *Next;
}CItem,* pItem;
pItem FItem,FFirst,FLast;
int CurLoc;
#pragma option push -vi-
pItem getItem(int Index)
{
if(Index<0)Index=0;
if(Index>=Count)Index=Count-1;
if(CurLoc>Index)
{
FItem=FFirst;
CurLoc=0;
}
while(FItem!=NULL&&CurLoc<Index)
{
CurLoc++;
FItem=FItem->Next;
}
return FItem;
}
#pragma option pop
#pragma option push -w-rvl
T &getData(int Index)
{
pItem ti=getItem(Index);
if(ti!=NULL)return ti->Data;
}
#pragma option pop
void setData(int Index,T &data)
{
pItem ti=getItem(Index);
if(ti!=NULL)ti->Data=data;
}
int( *FOnCompare)(T &,T &);
int FCount;
#pragma option push -vi-
void QS(pItem* ppItem,int Left,int Right)
{
pItem x,y;
int i,j;
i=Left;j=Right;
x=ppItem[(i+j)/2];
do{
while(FOnCompare(ppItem[i]->Data,x->Data)<0&&i<Right)i++;
while(FOnCompare(x->Data,ppItem[j]->Data)<0&&j>Left)j--;
if(i<=j)
{
y=ppItem[i];
ppItem[i]=ppItem[j];
ppItem[j]=y;
i++;
j--;
}
}while(i<=j);
if(Left<j)QS(ppItem,Left,j);
if(i<Right)QS(ppItem,i,Right);
}
#pragma option pop
public:
__property T Items[int Index] = {read=getData,write=setData};
__property int Count= {read=FCount};
__property int( *OnCompare)(T &,T &) = {read=FOnCompare,write=FOnCompare};
TDataList();
~TDataList();
int Add(const T &data);
void Delete(int Index);
void Insert(int Index,const T &data);
void Clear(void);
int IndexOf(const T &data);
T& Last(void){return FLast->Data};
T& First(void){return FFirst->Data};
void Sort(void);
};
template <class T> TDataList <T> :: TDataList()
{
FLast=FItem=FFirst=NULL;
FCount=0;
CurLoc=0;
FOnCompare=NULL;
}
template <class T> TDataList <T> :: ~TDataList()
{
if(FCount>0)Clear();
}
int template <class T> TDataList <T> :: Add(const T &data)
{
pItem Item=new CItem;
Item->Data=data;
Item->Next=NULL;
if(FCount==0)
{
FItem=FFirst=Item;
CurLoc=0;
}
else
{
FLast->Next=Item;
}
FLast=Item;
return FCount++;
}
void template <class T> TDataList <T> :: Delete(int Index)
{
pItem Item;
if(FCount<=0)return;
if(Index>=FCount)Index=FCount-1;
if(Index<=0)
{
Item=FFirst->Next;
delete FFirst;
FFirst=Item;
if(CurLoc==0) FItem=Item;
}
else
{
Item=getItem(Index-1)->Next;
FItem->Next=Item->Next;
delete Item;
if(CurLoc==Count-2)FLast=FItem;
}
FCount--;
if(FCount==0)FLast=FItem=FFirst=NULL;
}
void template <class T> TDataList <T> :: Insert(int Index,const T &data)
{
pItem Item=new CItem;
Item->Data=data;
if(Index>Count)Index=FCount;
if(Index<=0)
{
Item->Next=FFirst;
FFirst=Item;
CurLoc++;
if(FCount==0)
{
FItem=FLast=FFirst;
CurLoc=0;
}
}
else
{
getItem(Index-1); //CurLoc=Index-1;
Item->Next=FItem->Next;
FItem->Next=Item;
if(Index>=Count)FLast=Item;
}
FCount++;
}
void template <class T> TDataList <T> :: Clear(void)
{
pItem aItem=FFirst,bItem;
while(aItem)
{
bItem=aItem;
aItem=aItem->Next;
delete bItem;
}
FFirst=FItem=FLast=NULL;
FCount=CurLoc=0;
}
int template <class T> TDataList <T> :: IndexOf(const T &data)
{
pItem aItem=FFirst;
int i=0;
while(aItem)
{
if(aItem->Data==data)return i;
aItem=aItem->Next;
i++;
}
return -1;
}
void template <class T> TDataList <T> :: Sort(void)
{
if(FOnCompare==NULL)return;
if(FCount<2)return;
int i;
pItem*ppItem=new pItem[FCount];
ppItem[0]=FFirst;
for(i=1;i<FCount;i++)ppItem[i]=ppItem[i-1]->Next;
QS(ppItem,0,FCount-1);
FItem=FFirst=ppItem[0];
CurLoc=0;
for(i=1;i<FCount;i++)ppItem[i-1]->Next=ppItem[i];
FLast=ppItem[FCount-1];
FLast->Next=NULL;
delete []ppItem;
}
#endif
Top
8 楼Waiting4you(毛毛)回复于 2005-04-22 09:43:46 得分 7
用法:
TDataList <WideString> wLst;
Lst.Add(WideString("ABCDE"));//添加
Lst.Delete(0);//删除
for(int i=0;i<Lst.Count;i++)Lst.Items[i]=WideString("Changed!");//修改
Lst.Clear();//清除
Lst.Sort();//排序
Lst.Insert(0,WideString("It's Inserted!"));//插入
用法和TStringList类似
Top




