【问题标题】:Wondering about scope in C++ with structures and functions想知道 C++ 中的范围与结构和函数
【发布时间】:2014-01-04 15:59:40
【问题描述】:

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

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

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”函数,让该人输入他们的姓名,(正确输入(已经有效))然后能够访问和在main函数中打印?

【问题讨论】:

    标签: c++ function scope


    【解决方案1】:

    您的代码存在很多问题,但我会尽力提供帮助。通常,局部变量的 C++ 范围是在块级别。所以只要你看到一个结束括号 },范围就结束了。

    我注意到您的代码存在一些具体问题:

    • 这一行应该是:"cout info.name

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

    • 最后,当创建一个不需要返回任何东西的函数时, 您可以使用 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;
    }
    

    【讨论】:

    • 好吧...我看到了您代码中的逻辑,这很有意义。我对整个'public:std :: string name;'有点困惑。那有什么作用?它是否创建了一个数组以便更容易在函数之间传递? (因为过去我在尝试传递整个字符串而不仅仅是字符时遇到了麻烦)。再次感谢!
    • 对不起,我想我的问题是:std::string 是做什么的?
    • 嗯,好的。所以你只是一次声明一个完整的字符串。非常感谢您的帮助!
    【解决方案2】:

    您的代码并不是真正面向对象的。要修复范围,您必须将 gettingName 放入您的类中以使其成为 成员函数(这是 Google 的术语)。您还必须更改实现,然后需要包含类名以进行识别:

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

    来自main,然后通过

    info.gettingName();
    

    【讨论】:

    • 谢谢。我现在正在研究成员函数。另一个快速的问题, :: 做什么?或者它有一个我可以研究的名字吗?再次感谢!
    • 当然是 C++,只是不是面向对象的。声称不这样做是一种货物崇拜论点。
    • 找到了 :: 的名称,供任何偶然发现并想知道它的人使用,它是一个 范围解析运算符。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2023-04-06
    相关资源
    最近更新 更多