|
下面这段程序总是说“局部函数定义非法”,但我怎么也找不到错误,我也没有在类的定义中实现函数啊,”局部函数定义非法”一般都有哪几种情况?还有我见过一种情况,就是把函数定义写在类里面才可以,在外面就会出现错误,这又是怎么回事?请大家指点一下,
//该文件用于StuInfoManager类定义
#ifndef H_STUINFOMANAGER
#define H_STUINFOMANAGER
#include"StuInfoVec.h"
//StuInfoManager类定义
#endif
class StuInfoManager:public StuInfoVec
{
protected:
bool isModified;//学生信息是否被修改还未保存
int toRemvNodes;//做了删除标记的记录数
public:
static char* subject[];
protected:
//菜单选择函数
char menuSelect();
//显示表头
void dispTable();
//显示一条记录的信息
void dispRecord(Record *rec);
//找出给定总分在所有记录中的名次
int getIndex(float sum);
public:
StuInfoManager();
virtual ~StuInfoManager()
{}
//开始成绩管理程序的用户界面操作
virtual void start();
//菜单处理函数
virtual void handleMenu();
//显示记录
virtual void displayRecords();
//查询记录
virtual void queryRecord();
//增加记录
virtual void addRecord();
//删除记录
virtual void removeRecord();
//标注删除记录
virtual void removeNote(bool isToRemove);
//修改记录
virtual void modifyRecord();
//记录排序
virtual void sortRecords();
//保存记录
virtual void saveRecords();
//读取记录
virtual void loadRecords();
//结束程序
virtual void quit();
//清空当前记录
virtual void clear();
};
//////////////////
/该文件用于StuInfoManager类实现以及主函数实现
#include<fstream>
#include "StuInfoManager.h"
using namespace std;
//删除记录
void StuInfoManager::removeRecord()
{
if(empty())
{
cout<<"记录已空,退出删除操作!"<<endl;
return;
}
cout<<"1 标记待删除的记录\n"<<"2 执行标记\n"<<"3 取消指定记录的删除标记\n"<<"4 取消全部删除记录"<<endl;
string str;
do
{
cout<<"请选择进行的操作(1~4):";
cin>>str;
}while(str[0]<'1'||str[0]>'4');
switch(str[0])
{
case '1':
//这写,标记待删除的记录
removeNote(true);
break;
case '2':///执行标记
{
int num=removePerform();
toRemvNodes=0;
cout<<"一共删除了"<<num<<"条记录\n"<<"现在还剩下"<<size()<<"条记录"<<endl;
if(num!=0) isModified=true;
}
break;
case '3':
//取消指定记录的删除标记
removeNote(true);
break;
case '4'://取消全部删除记录
{
iter it;
iter it_end=last();
for(it=first();it!=it_end;it++)
(*it)->toBeDeleted=false;
toRemvNodes=0;
cout<<"所有删除标记已被取消"<<endl;
}
}
}
//标注删除记录
void StuInfoManager::removeNote(bool isToRemove)//---------------------------------------OK
{
if(empty())
{
cout<<"当前没有任何记录"<<endl;
return;
}
if(!isToRemove && toRemvNodes==0)
{
cout<<"当前没有做了删除标记的项目"<<endl;
return;
}
char choice;
char pattern[20];
int type;
while(true)
{
cout<<"请输入更改标记的记录方式:\n"\
<<"1.按学号\n"<<"2.按姓名\n"<<"3.按名次\n"\
<<"4.结束移除操作\n";
cin>>choice;
if(choice=='4') break;
if(choice=='1')
{ cout<<"请输入欲查询的学生学号:";
type=0;
}else if(choice=='2')
{ cout<<"请输入欲查询的学生姓名:";
type=1;
}else{ cout<<"请输入欲查询的学生名次:";
type=2;
}
cin>>pattern;
bool getMatch=false;
iter it=findRecord(pattern,type,first());
iter it_end=last();
while(it!=it_end)
{
//要取消标记而当前记录没有被标记,或要做标记而当前记录已标记,则继续下一条记录
if((!isToRemove && !(*it)->toBeDeleted)||(isToRemove && (*it)->toBeDeleted))
{ it=findRecord(pattern,type,++it); continue;}
getMatch=true;
cout<<"找到一条匹配的记录:\n";
dispTable();
dispRecord(*it);
cout<<"确定要改变这条记录的标记吗?[y/n]";
cin>>choice;
//改变这条记录的标记
if(choice!='n' && choice!='N')
(*it)->toBeDeleted=!(*it)->toBeDeleted;
if(isToRemove)
toRemvNodes++;
else toRemvNodes--;
it=findRecord(pattern,type,++it); //取下一个匹配的记录
}
if(!getMatch)
cout<<"没有找到匹配的记录"<<endl;
else
{ if(toRemvNodes!=0)
cout<<"当前有"<<toRemvNodes<<"条记录被做了删除标记"<<endl;
else cout<<"现在已经没有被做了删除标记的记录了\n";
}
}
}
//修改记录
void StuInfoManager::modifyRecord()
{//与removeNote上部分功能类似,选择操作方式是按学号、姓名、名次还是结束选择
if(empty())
{
cout<<"当前没有任何记录"<<endl;
return;
}
char choice;
char pattern[20];
int type;
while(true)
{
cout<<"请输入如何找到欲修改记录的方式:\n"\
<<"1.按学号\n"<<"2.按姓名\n"<<"3.按名次\n"\
<<"4.结束查询\n";
cin>>choice;
if(choice=='4') break;
if(choice=='1')
{ cout<<"请输入欲查询的学生学号:";
type=0;
}else if(choice=='2')
{ cout<<"请输入欲查询的学生姓名:";
type=1;
}else{ cout<<"请输入欲查询的学生名次:";
type=2;
}
cin>>pattern;
bool getMatch=false;
iter it=findRecord(pattern,type,first());
iter it_end=last();
while(it!=it_end)
{
getMatch=true;
cout<<"找到一条匹配的记录:\n";
dispTable();
dispRecord(*it);
cout<<"确定要改变这条记录吗?[y/n]";
cin>>choice;
//改变这条记录的标记
if(choice!='n' && choice!='N')
break;
if(choice!='y' && choice!='Y')
{
cout<<"请重新输入学生的信息:"<<endl;
cout<<"请输入学号:";
cin>>(*it)->number;
//操作相似,输入姓名、性别,及各科成绩
cout<<" 请输入姓名:";
cin>>rec->name;
cout<<"请输入性别(0表示女,1表示男):";
for(i=0;i<NUM_SUBJECT;i++)
{
cout<<"请输入"<<subject[i]<<"的成绩:";
cin>>rec->score[i];
sum+=rec->score[i];
}
rec->sum=sum;
rec->average=sum/NUM_SUBJECT;
rec->index=getIndex(sum);
StuInfoVec::addRecord(rec);
}
}
int ncount=0;
iter it1;
for(it1=first(); it1!=it_end; it1++)
{
if(it1==it) continue;
if((*it1)->index>tmpi && (*it1)->sum>=sum)
(*it1)->index--;
else if((*it1)->index<=tmpi && (*it1)->sum<sum)
(*it1)->index++;
if((*it1)->sum>sum)
ncount++;
}
//ncount是总分比当前学生的总分大的学生的人数
//当前学生的名次是ncount+1
(*it)->index=ncount+1;
isModified=true;
//取下一条匹配的记录
it=findRecord(pattern,type,++it);
}
cout<<"已找完所有的记录\n"<<endl;
}
/////////////////////////
studentManagement\StuInfoManager.cpp(215) : error C2601: 'removeRecord' : local function definitions are illegal
E:\C++练习\studentManagement\StuInfoManager.cpp(259) : error C2601: 'removeNote' : local function definitions are illegal
E:\C++练习\studentManagement\StuInfoManager.cpp(323) : error C2601: 'modifyRecord' : local function definitions are illegal
E:\C++练习\studentManagement\StuInfoManager.cpp(411) : error C2601: 'sortRecords' : local function definitions are illegal
E:\C++练习\studentManagement\StuInfoManager.cpp(416) : error C2601: 'saveRecords' : local function definitions are illegal
E:\C++练习\studentManagement\StuInfoManager.cpp(423) : error C2601: 'loadRecords' : local function definitions are illegal
E:\C++练习\studentManagement\StuInfoManager.cpp(428) : error C2601: 'quit' : local function definitions are illegal
E:\C++练习\studentManagement\StuInfoManager.cpp(436) : error C2601: 'clear' : local function definitions are illegal
E:\C++练习\studentManagement\StuInfoManager.cpp(463) : error C2601: 'main' : local function definitions are illegal
E:\C++练习\studentManagement\StuInfoManager.cpp(473) : fatal error C1004: unexpected end of file found
Error executing cl.exe.
StuInfoManager.obj - 10 error(s), 0 warning(s)
真是晕啊 |
|