想知道C++中的结构和函数的作用域

Wondering about scope in C++ with structures and functions

本文关键字:函数 作用域 结构 想知道 C++      更新时间:2023-10-16

我正在编写一个程序,该程序允许我输入自己的名字,列出不同的学期,并允许我输入成绩,然后能够计算我的班级平均成绩和平均成绩,仅供我自己在课程中参考。

我遇到的问题是结构以及它们如何与多功能程序一起工作。在我的课程中,我们没有涵盖这一点,我花了一段时间寻找答案,但找不到答案。以下是我当前的代码:

using namespace std;
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char gettingName();
class Student{
public:
double semesterClass[20][20];       //first is for semester, second is for which class
char name[20];
int semester;
int numOfCourses;
};
int main(int argc, char **argv)
{
Student info;
gettingName();
cout << "Hi my name is: " << name.info << endl;
return 0;
}
char gettingName()
{
Student info;
char YesNo[5];
char boolean[1] = {'T'};
char yes[3] = {'Y','e','s'};
char yes2[3] = {'Y','E','S'};
char yes3[3] = {'y','e','s'};
char yes4[1] = {'Y'};
char yes5[1] = {'y'};
while(boolean[0] == 'T'){
cout << "What is your name? ";
cin >> info.name;
cout << endl;
cout << "Is your name " << info.name << "?"<<endl;  //accepted input will be Y,y,YES,Yes,yes
cin >> YesNo;
//if input does not equal any of the accepted inputs, then loop until it does
if((strcmp(YesNo,yes) == 0) || (strcmp(YesNo,yes2) == 0) || (strcmp(YesNo,yes3) == 0) || (YesNo[0] == yes4[0]) || (YesNo[0] == yes5[0])){
boolean[0] = 'F';
}
}
return 0;
}

我的问题是:我该如何修复作用域,这样我就可以调用"gettingName"函数,让人输入他们的名字(正确地输入(这已经有效了)),然后能够在主函数中访问和打印它?

您的代码有很多问题,但我会尽我所能提供帮助。一般来说,局部变量的C++作用域在块级别。因此,每当您看到结束括号}时,作用域就结束了。

我注意到你的代码中的一些特定问题:

  • 这一行应该是:"cout<<"嗨,我的名字是:"<<info.name<endl;",不是的名称

  • 可以更有效地处理布尔循环。您应该尝试在一个数据结构(如数组)中列出所有可接受的选项,然后在数组中循环。

  • 最后,当创建一个不需要返回任何内容的函数时,您可以使用类型void而不是char。所以它可以是void gettingName(),而不是char gettingName。

作为一个示例,为了向您展示一种快速简便的方法来完成我认为您想要的操作,我稍微简化了您的代码。我还决定使用std::string而不是char数组,因为它们更容易使用:

class Student{
public:
std::string name;
};
std::string gettingName();
int main()
{
Student Info;
Info.name = gettingName();
cout << "Hi my name is: " << Info.name << endl;
return 0;
}
std::string gettingName()
{
std::string name;
cout << "What is your name? ";
cin >> name;
cout << endl;
return name;
}

您的代码实际上并不是面向对象的。要修复作用域,您必须将gettingName放入类中,使其成为成员函数(顺便说一下,这是Google的术语)。您还必须更改实现,然后需要包括用于标识的类名:

char Student::gettingName()
{
...
}

main,你可以通过呼叫它

info.gettingName();