must have class/struct/union type错误

时间:2022-06-01 17:03:09
#include<iostream.h>
#include<stdlib.h>
#include"linearList.h"
const int defaultSize=100;
template<class T>
class LinearList
{
public:
LinearList();
virtual int Size()const=0;
virtual int Length()const=0;
virtual int Search(T& x)const=0;
virtual int Locate(int i)const=0;
virtual bool getData(int i,T& x)const=0;
virtual void setData(int i,T& x)=0;
virtual bool Insert(int i,T& x)=0;
    virtual bool Remove(int i,T& x)=0;
virtual bool IsEmpty()const=0;
virtual bool IsFull()const=0;
virtual void Sort()=0;
virtual void input()=0;
virtual void output()=0;
};
template<class T>
class SeqList:public LinearList<T>{
protected:
T*data;//存放数组
int maxSize;//最大可容纳表项的项数
int last;//当前已存表象的最后位置(从0开始)
public:
SeqList(int sz=defalutSize);//构造函数
SeqList(SeqList<T>&L);//复制构造函数
~SeqList(){delete[]data;}//析构函数
int Size()const{return maxSize;}//计算表最大可容纳的表项个数
int Length()const{return last+1;}//计算表的长度
int Search(T&x)const;//搜索x在表中的位置,函数返回表项序号
int Locate(int i)const;//定位第i个表项,函数返回表项序号
bool getData(int i,T&x)const//取第i个表项的值
    {
if (i>0&&i<=last+1){
x=data[i-1];
return ture;}else return false;}
    void setData(int i,T& x)//用x修改第i个表项的值
{if (i>0&&i<=last+1) data[i-1]=x;}
bool Insert(int i,T&x);//插入x在第i个表项之后
bool Remove(int i,T&x);//删除第i个表项,通过x返回表项的值
bool IsEmpty(){return(last==-1)?turn;false;}//判表空否,空则返回Ture;否则返回false
bool IsFull(){return (last==maxSize-1)?ture:false;}//判表满否,满则返回ture;否则返回false
void input();//输入
void output();//输出
SeqList<T>operator=(SeqList<T>&L);//表整体赋值
private:
template<class T>
    void reSize(int newSize)
{
//私有函数,扩充顺序表的存储数组空间大小,新数组的元素个数为newSize。
if(newSize<=0)
{cerr<<"无效的数组大小"<<endl;return;}
if(newSize!=maxSize)
{
//修改
T*newarray==new T[newSize];//建立新数组
if(newarray==NULL)
{derr<<"存储分配失败"<<endl;exit(1);}
int n=last+1;
T*srcptr=data;//原数组首地址
T*destptr=newarray;//目的数组首地址
while(n--)*destptr++=*srcptr++;//复制
delete[]data;//删老数组
data=newarray;maxSize=newSize;//复制新数组
}
}
};

template<class T>
SeqList<T>::SeqList(int sz){
//构造函数,通过指定参数sz定义数组的长度
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;T value;
data=new T[maxSize];//创建顺序表存储数组
if(data==NULL)//动态分配失败
{cerr<<"存储分配失误!"<<endl;exit(1);}
(int i=1;i<=last+1;i++)
{L.getData(i,value);data[i-1]=value;}
}

template<class T>
int SeqList<T>::Search(T&x)const{
//搜索函数,在表中顺序搜索与给定值x匹配的表项,找到则函数返回该表项是第几个元素,否则函数返回0,表示搜索失败
for(int i=0;i<=last;i++)
if(data[i]==x)returni+1;//顺序搜索
    return 0;//搜索失败
}
template<class T>
int SeqList<T>::Locate(int i)const
{
//定位函数:函数返回第i(1<=i<=last+1)个表项的位置,否则函数返回0,表示定位失败。
if(i>=1&&i<=last+1)
return i;
else 
return 0;
}

template<class T>
bool SeqList<T>::Insert(int i,T&x){
//将新元素x插入到表中第i(0<=i<=last+1)个表项之后,函数返回插入成功的信息,若插入成功,则返回ture;否则返回false。i=0是虚拟的,实际上是插入到第i个元素位置
if(last==maxSize-1)return false;//表满,不能插入
if(i<0||i>last+1)return false;//参数i不合理,不能插入
for (int j=last;j>=i;j--)
data[j+1]=data[j];//依次后移,空出第i号后的位置
data[i]=x;//插入
last++;//最后位置加1
return ture;//插入成功
}
template<class T>
bool SeqList<T>::Remove(int i,T&x){
//从表中删除第i(1<=i<=last=1)个表项,通过引用型参数x返回删除的元素值。函数返回删除成功的信息,若删除成功则返回ture,否则返回false.
if(last==-1)return false;//表空,不能删除
if(i<1||i>last+1)return false;//参数不合理,不能删除
x=data[j-1];//存被删元素的值
for(int j=i;j<=last;j++)
data[j-1]=data[j];//依次前移,填补
last--;//最后位置减1
return ture;//删除成功
}
template<class T>
void SeqList<T>::input(){
//从标准输入(键盘)逐个数据输入,建立顺序表
cout<<"开始建立顺序表,请输入表中元素个数:";
while(1){
cin>>last;//输入元素最后位置
cout<<"表元素个数输入有误,范围不能超过"<<maxSize-1<<":";
}
for (int i=0;i<=last;i++)//逐个输入表元素
{cin>>data[i];cout<<i+1<<endl;}
}
template <class T>
void SeqList<T>::output(){
//将顺序表全部元素输入到屏幕上。
cout<<"顺序表当前元素最后位置为:"<<last<<endl;
for(int i=0;i<=last;i++)
cout<<"#"<<i+1<<":"<<data[i]<<endl;
}
template<class T>
SeqList<T>SeqList<T>::operator=(SeqList<T> & L){
//重载操作:顺序表整体赋值。若当前调用次函数的表对象为L1,代换形参L的 表对象为L2,则使用方式为L1=L2.实现代码可参照复制构造函数自行编写。
}
void main()
{
SeqList a();
int c,i,x;
cout<<"1.顺序表的建立"<<endl;
cout<<"2.顺序表的插入"<<endl;
cout<<"3.顺序表的删除"<<endl;
cout<<"4.顺序表的搜索"<<endl;
cout<<"5.顺序表的定位"<<endl;
cout<<"6.顺序表的输出"<<endl;
cout<<"0.退出操作"<<endl;
cout<<"请选择您要进行的操作:"<<endl;
cin>>c;
switch(c)
{
   case 1:a.input();
   break;
   case 2:cout<<"请输入您要插入的位置:";
   cin>>i;
   a.Insert(i,x);
   break;
   case 3:cout<<"请输入您要删除的位置:";
   cin>>i;
   a.Remove(i,x);
   break;
   case 4:cout<<"请输入您要搜索的位置:";
   cin>>x;
   a.Search(x);
   break;
case 5:cout<<"请输入您要定位的元素位置:";
   cin>>i;
   a.Locate(i);
   break;
case 6:
a.output();
   break;
case 7:cout<<"谢谢使用!";
   break;
}
}

f:\vc++6.0\microsoft visual studio\myprojects\aa\0.cpp(177) : error C2228: left of '.input' must have class/struct/union type
f:\vc++6.0\microsoft visual studio\myprojects\aa\0.cpp(181) : error C2228: left of '.Insert' must have class/struct/union type
f:\vc++6.0\microsoft visual studio\myprojects\aa\0.cpp(185) : error C2228: left of '.Remove' must have class/struct/union type
f:\vc++6.0\microsoft visual studio\myprojects\aa\0.cpp(189) : error C2228: left of '.Search' must have class/struct/union type
f:\vc++6.0\microsoft visual studio\myprojects\aa\0.cpp(193) : error C2228: left of '.Locate' must have class/struct/union type
f:\vc++6.0\microsoft visual studio\myprojects\aa\0.cpp(196) : error C2228: left of '.output' must have class/struct/union type
执行 cl.exe 时出错.

3 个解决方案

#1


SeqList a();
...
case 1:a.input();


SeqList a();这只是声明了一个函数而已,函数名叫a,函数无需参数,函数的返回类型是SeqList。
改成SeqList a;这才是定义对象。

#2


引用 1 楼  的回复:
C/C++ code
SeqList a();
...
case 1:a.input();


SeqList a();这只是声明了一个函数而已,函数名叫a,函数无需参数,函数的返回类型是SeqList。
改成SeqList a;这才是定义对象。



可是这样改过之后还是有错

#3


#include"linearList.h"
你已经整成一个文件了,这行不要了吧?


SeqList是模板类,要这样子定义对象SeqList< int > a;

virtual bool IsEmpty()const=0;
virtual bool IsFull()const=0;
virtual void Sort()=0;
这三个纯虚函数,派生类的定义在哪里?

#1


SeqList a();
...
case 1:a.input();


SeqList a();这只是声明了一个函数而已,函数名叫a,函数无需参数,函数的返回类型是SeqList。
改成SeqList a;这才是定义对象。

#2


引用 1 楼  的回复:
C/C++ code
SeqList a();
...
case 1:a.input();


SeqList a();这只是声明了一个函数而已,函数名叫a,函数无需参数,函数的返回类型是SeqList。
改成SeqList a;这才是定义对象。



可是这样改过之后还是有错

#3


#include"linearList.h"
你已经整成一个文件了,这行不要了吧?


SeqList是模板类,要这样子定义对象SeqList< int > a;

virtual bool IsEmpty()const=0;
virtual bool IsFull()const=0;
virtual void Sort()=0;
这三个纯虚函数,派生类的定义在哪里?