首页 > 解决方案 > 错误 - 未在此范围内声明 int 'counter'

问题描述

\main112.cpp    In function 'int main()':
63  36  \main112.cpp    [Error] 'counter' was not declared in this scope
28               \Makefile.win  recipe for target 'main112.o' failed
#include <string>
#include <iostream>
#include <windows.h>
#include <stdlib.h>

using namespace std;

struct Person
{
    string name;
    string race;
    int weight;

    void write();
    void show();
    void check();
};

void Person::show()
{
    cout<<"ÔÈÎ: "<<name<<endl;
    cout<<"Íîìåð ðåéñà: "<<race<<endl;
    cout<<"Âåñ áàãàæà: "<<weight<<endl;
}

void Person::write()
{
    cout<<"Ââåäèòå ÔÈÎ: ";
    getline(cin,name);
    cout<<"Ââåäèòå íîìåð ðåéñà: ";
    getline(cin,race);
    cout<<"Ââåäèòå âåñ áàãàæà: ";
    cin>>weight;
    cin.ignore();
}

void Person::check()
{
    int counter = 0;
    if(weight>10)
    {
        counter++;
    }
}

int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    setlocale(0, "Russian");


    Person* persons=new Person[4];
    for (int i = 0; i < 4; i++)
    {
        persons[i].write();
    }
    for (int i = 0; i < 4; i++)
    {
        persons[i].show();
        persons[i].check();
    }
    cout<<"Ñ áàãàæîì áîëüøå 10 êã: "<<counter<<" ÷åëîâåê"<<endl;

    delete[] persons;
    return 0;
}

程序按照其编码方式工作并且应该工作,没有这个问题

家庭作业:

编写一个处理乘客信息的程序。信息包括: 1) 乘客全名。2) 航班号。3) 行李重量 该程序应允许用户: 1) 从键盘读取数据并显示。2) 计算行李重量超过10公斤的旅客人数

标签: c++

解决方案


熟悉范围的概念

因为它的作用域是函数Person::checkcounter只在范围内可见Person::check。不允许程序的其他部分与之交互。

建议的解决方案:

更改Person::check(及其声明)以返回布尔值。例子:

bool Person::check() const 
{
    return weight>10;
}

声明该方法const以保证此函数不会更改对象。这样做是为了防止错误并允许在常量上使用不应更改对象的函数Person。这可以防止细微的错误潜入代码。

现在用户可以check根据自己的Person行李重量做check任何他们想做的事情。在 的情况下main,它想保持计数。任何人都没有理由main知道它的作用,因此counter应该由main. 例如:

int main()
{
   ...


    int counter = 0;
    for (int i = 0; i < 4; i++)
    {
        persons[i].show();
        if (persons[i].check()) 
        {
            counter++;
        }
    }
    cout<<"Ñ áàãàæîì áîëüøå 10 êã: "<<counter<<" ÷åëîâåê"<<endl;
    ...
}

旁注:似乎不需要persons动态分配。考虑更换

Person* persons=new Person[4];

Person persons[4];

并删除

delete[] persons;

如果您正在动态分配以准备可变数量的Persons,则更喜欢使用std::vector

std::vector<Person> persons;

push_backemplace_back Persons,因为它们被介绍了。


推荐阅读