VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1333|回复: 10

为什么总是说“局部函数定义非法”

[复制链接]

2

主题

7

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-11-11 10:00:01 | 显示全部楼层 |阅读模式
下面这段程序总是说“局部函数定义非法”,但我怎么也找不到错误,我也没有在类的定义中实现函数啊,”局部函数定义非法”一般都有哪几种情况?还有我见过一种情况,就是把函数定义写在类里面才可以,在外面就会出现错误,这又是怎么回事?请大家指点一下,
//该文件用于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)
真是晕啊
回复

使用道具 举报

0

主题

3

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-11-11 12:30:01 | 显示全部楼层
既然是练习,何不将源码打包传上来。
回复

使用道具 举报

0

主题

3

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-11-11 13:00:01 | 显示全部楼层
从最后一个错误看,可能是cpp文件没有包含stdafx.h。
回复

使用道具 举报

2

主题

7

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-11-11 13:30:01 | 显示全部楼层
不是练习,是我们要做的课程设计,只是放到那个文件夹里去了。没有stdafx.h。一个控制台程序,里面的函数可以说是没有问题的,除了还没定义好的,但是显示把定义好的和没有定义好的全都说成是非法定义
回复

使用道具 举报

0

主题

3

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-11-11 13:45:01 | 显示全部楼层
你建的VC工程需要stdafx.h,如果没有VC就报错。
你可以新建一个不需要stdafx.h的工程。可能就没错了。
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-11-11 14:00:01 | 显示全部楼层
studentManagement\StuInfoManager.cpp(215) : error C2601: 'removeRecord' : local function definitions are illegal
很简单的出错信息。
这个说明函数removeRecord之间的函数定义中{}不匹配,{比}多,这样,编译器就认为前面的函数还没有结束,那么你就是在前面的函数内部再定义新函数removeRecord,这就是local function definition, 在C/C++里面是不允许的。
回复

使用道具 举报

2

主题

7

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-11-11 14:30:01 | 显示全部楼层
再找找看吧
回复

使用道具 举报

0

主题

11

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
发表于 2020-11-11 15:15:01 | 显示全部楼层
看出错提示应该是"{"跟"}"不一样多,可是我数一下又是一样多-_-b

不过这个
#ifndef H_STUINFOMANAGER
#define H_STUINFOMANAGER
#include"StuInfoVec.h"
//StuInfoManager类定义
#endif
里面的#endif应该放到.h最后去吧?
回复

使用道具 举报

2

主题

7

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-11-11 15:45:01 | 显示全部楼层
我找到了,是上一个函数的{}个数不一致
谢谢大家了
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-11-11 17:00:01 | 显示全部楼层
3q very much!!!!!就是上个函数花括号不匹配!!!!我也遇到相同问题了!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表