纯虚函数的构造函数问题,求助

JustIvanLong 2008-04-04 10:27:39
我定义了如下纯虚类:
//
//
//线线表的抽象基类定义
//
//


template <class T>
class LinearList{
public:
LinearList();
~LinearList();
virtual int Size() const=0; //求表最大的容量
virtual int Length() const=0; //求表长度
virtual int Search(T x) const=0; //在表中搜索给定值x
virtual T* getData(int i) const=0; //取第i个元素
virtual void setData(int i,T x)=0; //修改第i个元素的值为x
virtual int Insert(int i,T x)=0; //在第i个表项后插入x
virtual int Remove(int i,T& x)=0; //删除第i个表项,通过x返回
virtual int IsEmpty() const=0; //判断表空
virtual int IsFull() const=0; //判断表满
virtual void input()=0; //输入表项
virtual void output()=0 ; //输出表项


};


虽然我的纯虚函数中的构造函数没有定义,但是在继承后也不至出错吧,
派生类:
#include<iostream.h>
#include<stdlib.h>
#include"LinearList.H"

const int defaultSize = 100;

template <class T>
class SeqList: public LinearList<T>
{
protected:
T* data;
int maxSize;
int last;
void reSize(int newSize);
public:
SeqList(int sz=defaultSize);
SeqList(SeqList<T>& L);

~SeqList()
{delete[] data;}

int Size()const
{return maxSize;}

int Length()const
{return last+1;}

int Search(T x)const;

T* getData(int i)const
{return( i > 0 && i <= last+1 )?&data[i-1]:NULL;}

void setData(int i, T x)
{ if( i > 0 && i <= last+1 ) data[i-1]=x;}

int Insert(int i,T x);
int Remove(int i,T& x);
int IsEmpty()const{return (last==-1)?1:0;}

int IsFull()const{return (last==maxSize-1)?1:0;}

void input();
void output();

};


template <class T>
SeqList<T>::SeqList(int sz=defaultSize)
{
if(sz>0)
{
maxSize = sz; last = -1;
data= new T[maxSize];
if(data==NULL)
{
cerr<<"内存分配出错!"<<endl;exit(1);
}
}
}

template <class T>
SeqList<T>::SeqList(SeqList<T>& L)
{
maxSize = L.Size();
last=L.Length-1;
data=new T[maxSize];
if(data == NULL)
{cerr<<"内存分配出错!"<<endl; exit(1);}

for(int i = 1; i<=last+1; i++)
data[i-1] = L.getData(i);
}

template <class T>
void SeqList<T>::reSize(int newSize)
{
if(newSize <= 0)
{cerr<<"无效的数组大小!"<<endl;exit(1)}

if(newSize != maxSize)
{
T* newarray =new T[newSize];
if(newarray == NULL)
{cerr<<"内存分配出错!"<<endl; exit(1);}
int n=last+1;
T *srcptr =data;
T *desptr=newarray;
while(n--) *desptr++=*srcptr++;
delete [] data;
data = newarray; maxSize = newSize;
}
}


template <class T>
int SeqList<T>::Search(T x)const{
for(int i=0 ;i<=last; i++)
if(data[i]==x) return i+1;
return 0;
}


template <class T>
int SeqList<T>::Insert(int i, T x)
{
if(last == maxSize-1) return 0;
if(i<0 || i>last+1 ) return 0;
for(int j=last ; j>=i ; j--)
data[j+1]=data[j];
data[i]=x;
last++;
return 1;
}

template <class T>
int SeqList<T>::Remove(int i, T &x)
{
if(last == -1) return 0;
if( i<1 || i>last+1) return 0;
x=data[i-1];
for(int j=i ;j<=last ;j++)
data[j-1]=data[j];
last--;
return 1;
}

template <class T>
void SeqList<T>::input()
{
cout<<"开始建立顺序表,请输入表中元素最后一个的下标数:";
while(1)
{
cin>>last;
if( last <= maxSize-1 ) break;
cout<<"表最后元素下标输入有误,范围不能超过"<<maxSize-1<<"!";
}
cout<<"当前顺序表长度为"<<last+1<<endl;
cout<<"当前顺序表最大允许长度为"<<maxSize<<endl;
cout<<"请依次输入"<<last+1<<"个数:"<<endl;
for(int i = 0; i<=last ;i++)
{
cin>>data[i];
}

}

template <class T>
void SeqList<T>::output()
{
cout<<"顺序表当前最后位置为:"<<last<<endl;
for(int i=0 ;i<=last ; i++)
cout<<"#"<<"data["<<i<<"]"<<":"<<data[i]<<endl;
}
























测试的入口程序:

#include"SeqList.h"
void main()
{
//纯虚函数出错,调试中啊。。。。。
SeqList<char> temp(10);
temp.input();

temp.output();
cout<<"请输入你要插入的位置和数据:";
int i;
char dat;
cin>>i>>dat;

temp.Insert(i,dat);
temp.output();

cout<<"请输入你要删除的位置:";
cin>>i;
temp.Remove(i,dat);
temp.output();
cout<<"\n删除数据:"<<dat<<"成功!"<<endl;

cout<<"请输入你要搜索的数据:";
cin>>dat;
i=temp.Search(dat);
if(i)cout<<"\n搜索成功!数据位于下标:"<<i-1<<endl;
else cout<<"\n数据不存在!"<<endl;
}


当我把抽象基类的构造函数和析构函数去掉后,程序就能够成功运行,否则,出现如下错误:
TestSeqList.obj : error LNK2001: unresolved external symbol "public: __thiscall LinearList<char>::~LinearList<char>(void)" (??1?$LinearList@D@@QAE@XZ)
TestSeqList.obj : error LNK2001: unresolved external symbol "public: __thiscall LinearList<char>::LinearList<char>(void)" (??0?$LinearList@D@@QAE@XZ)
Debug/TestSeqList.exe : fatal error LNK1120: 2 unresolved externals

我也不知道为何,虽然说这里的基类构造函数没有作用.但是我在其它应用中还是有可能需要抽象基类的构造函数的
...全文
564 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
纯虚函数不能构造。
[/Quote]

我知道对象需要构造,没有听过函数也要构造的。 抽象基类可以有构造函数。
mujiok2003 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
抽象类本来就没有构造函数也不需要也不允许有构造函数。
[/Quote]

为啥不允许?
mujiok2003 2012-10-26
  • 打赏
  • 举报
回复
纠正一下,申明了,没有定义。

[Quote=引用 2 楼 的回复:]
这样叫没定义?

这个叫定义了,但是没实现。


改成

C/C++ code

template <class T>
class LinearList{
public:
LinearList() {}//或者直接删除
virtual ~LinearList() {}//或者直接删除,虚化为了继承调用
virtual i……
[/Quote]
jiuyueshouyi 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

抽象类本来就没有构造函数也不需要也不允许有构造函数。
[/Quote]
C++标准哪点规定一个类不允许有构造函数了?
jieao111 2008-04-04
  • 打赏
  • 举报
回复
lz找本书看看把,,纯虚函数是啥都不知道.....
yshuise 2008-04-04
  • 打赏
  • 举报
回复
纯虚函数不能构造。
积木 2008-04-04
  • 打赏
  • 举报
回复
你可是说的是纯虚class啊。你都有构造函数了,还纯么~~~
积木 2008-04-04
  • 打赏
  • 举报
回复
但是其它总有些地方需要这样的类型的构造函数吧?

-- 不可能有。你能想象出来什么地方需要吗?
Treazy 2008-04-04
  • 打赏
  • 举报
回复
不谈设计上的缺陷

如果硬要调用派生类的方法,那也是可以的,所以这是设计上的问题,不是语言上的问题
JustIvanLong 2008-04-04
  • 打赏
  • 举报
回复
我知道,但是错误的原因是什么,在这里是可以删除,但是其它总有些地方需要这样的类型的构造函数吧?
积木 2008-04-04
  • 打赏
  • 举报
回复
请问这样的一个逻辑,你做了这样的一个带有构造函数的抽象类。。。然后里面很多函数都没有实现。
那么如果我做了一个这个类的对象,请问这个对象调用那些没实现的函数的话,会有什么行为?
呵呵。

抽象类的构造函数是不可能被需要的。
Treazy 2008-04-04
  • 打赏
  • 举报
回复
这样叫没定义?

这个叫定义了,但是没实现。


改成

template <class T>
class LinearList{
public:
LinearList() {}//或者直接删除
virtual ~LinearList() {}//或者直接删除,虚化为了继承调用
virtual int Size() const=0; //求表最大的容量
virtual int Length() const=0; //求表长度
virtual int Search(T x) const=0; //在表中搜索给定值x
virtual T* getData(int i) const=0; //取第i个元素
virtual void setData(int i,T x)=0; //修改第i个元素的值为x
virtual int Insert(int i,T x)=0; //在第i个表项后插入x
virtual int Remove(int i,T& x)=0; //删除第i个表项,通过x返回
virtual int IsEmpty() const=0; //判断表空
virtual int IsFull() const=0; //判断表满
virtual void input()=0; //输入表项
virtual void output()=0 ; //输出表项


};
积木 2008-04-04
  • 打赏
  • 举报
回复
抽象类本来就没有构造函数也不需要也不允许有构造函数。

64,644

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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