【问题标题】:Scope and accessor functions with second constructors?具有第二个构造函数的范围和访问器函数?
【发布时间】:2016-10-26 01:01:53
【问题描述】:

所以基本上我的教授给了我们班上的学生,并告诉我们实现所有功能并为该功能编写一个 main。我正在尝试这样做,但我无法找出正在出现的错误,在我的所有访问器函数中,它告诉我 nCredits、gpa 和 s 未在范围内声明。我认为这与第二个构造函数有关,但我不确定到底是什么问题。第二个构造函数和 displayStRec 函数也提供给我们的类,我只是不知道如何将成员函数中的变量按原样重命名。

#include <iostream>
using namespace std;
class student
{
            public:
                            student();
                            student(string s, double gpa, int nCredits);
                            ~student(); //destructor
                            void changeCredits(int nCredits);

                            int getCredits();

                            void changeGPA(double gpa);

                            double getGPA();

                            void displayStRec();

            private:
                            string name;
                            double GPA;
                            int credits;
};

student::student()
{
            name = "No name yet";
            GPA = 0;
            credits = 0.0;
            cout << "Default constructor entered!" << endl;
}
student::student(string s, double gpa, int nCredits)
{
            name = s;
            GPA = gpa;
            credits = nCredits;
            cout << "Second constructor entered!" << endl;
}

void student::changeCredits(int nCredits){
 cout << "Enter credits earned:" << endl;
 cin >> nCredits;
}

int student::getCredits(){
return nCredits;
}

void student::changeGPA(double gpa){
 cout << "Enter GPA: " << endl;
 cin >> gpa;
}

double student::getGPA(){
 return gpa;
}

void student::displayStRec()
{
        cout << "   Name: " << s <<endl;
        cout << "    GPA: " << gpa <<endl;
        cout << "Credits: " << nCredits <<endl;
}

student::~student()
{
            cout << "Destructor entered!" << endl;
}

int main()
{
            student s1,s2("John",4.0,42);
            s2.changeCredits(nCredits);
            s2.getCredits();
            s2.changeGPA(gpa);
            s2.getGPA();
            s2.displayStRec();
            return 0;
}

【问题讨论】:

  • 您的变量名拼写错误。您有一个私人 credits 成员,但没有 nCredits 成员。紧跟在private之后。
  • 你应该改用成员变量。
  • 抱歉,c++ 区分大小写,不会读心
  • 我知道我有学分和 nCredits,但任务应该是这样的。第二个构造函数给了我们,它改变了 credits = nCredits 等。成员函数原型也给了使用,所以我必须使用给我错误的重命名的数据类型。任何有关如何执行此操作的帮助将不胜感激。
  • 但是你没有nCreditsgpa的会员数据

标签: c++ function class


【解决方案1】:

您使用了三个未声明的变量。我会一一击中他们。

缺少s

void student::displayStRec()
{
        cout << "   Name: " << s <<endl;
        cout << "    GPA: " << gpa <<endl;   
        cout << "Credits: " << nCredits <<endl;  
}

在这个函数中,你试图输出一些变量s,它没有在 displayStRec 的范围内声明。您在构造函数中使用了s 来初始化名称,并将其复制到成员变量name。好吧,s 现在不见了!但是name 在对象的整个生命周期内都存在。所以,请改用name

void student::displayStRec()
{
        cout << "   Name: " << name <<endl;  //Change it here
        cout << "    GPA: " << gpa <<endl;
        cout << "Credits: " << nCredits <<endl;
}

缺少 nCredits 和 gpa

在您的主函数中,您使用了两个未声明的变量。

int main()
{
            student s1,s2("John",4.0,42);
            s2.changeCredits(nCredits);  //What nCredits?
            s2.getCredits();
            s2.changeGPA(gpa);           //What gpa?
            s2.getGPA();
            s2.displayStRec();
            return 0;
}

这就引出了一个问题……您想将他们的信用更改为做什么?您想将他们的 gpa 更改为做什么?换句话说,你的程序不应该有输入参数吗?也许在你的任务中,你的教授告诉你要提供什么价值。您将需要某种常量,或者您需要从 cin 收集用户输入。

哦,顺便说一句,这是零意义

void student::changeGPA(double gpa){
    cout << "Enter GPA: " << endl;
    cin >> gpa;
}

此函数将接受用户输入并更新变量gpa,该变量在本地范围内声明并立即丢弃。不是很有用。

此外,它接受输入值 (double gpa),但也收集来自 cin 的输入。为什么两者都做?不能同时更新为两个值!

我的猜测是应该更新对象的 GPA,它是在成员范围内声明的。像这样:

void student::changeGPA(){
    cout << "Enter GPA: " << endl;
    cin >> GPA;
}

void student::changeGPA(double gpa){
    GPA = gpa;
}

结论

以下其中一项必须为真:

  1. 您错误地复制了代码示例
  2. 教授给你出了一道题
  3. 教授有点不知所措,或者有点过度劳累

【讨论】:

  • 很好理解你的第二点,谢谢。然而,void displayStRec() 函数是给了我们的,到底有没有用这些而不是私有变量来实际执行这个程序?
  • 除非s是成员变量或全局变量,否则写的函数永远不会编译。
  • @runesbane 老师给学生破解代码的情况并不少见。我在我的课程中多次获得它。
  • @John 既然你发了,不妨指出changeGPA的问题。
  • @Raindrop7 它不应该传递任何东西,或者不直接询问用户。目前尚不清楚意图是什么。
【解决方案2】:

我已经继续删除了我的教授试图强加给我们的草率的第二个构造函数,这个程序现在可以正常工作了:

#include <iostream>
using namespace std;
class student
{
            public:
                            student();
                            student(string s, double gpa, int nCredits);
                            ~student(); //destructor
                            void changeCredits();

                            int getCredits();

                            void changeGPA();

                            double getGPA();

                            void displayStRec();

            private:
                            string name;
                            double GPA;
                            int credits;
};

student::student()
{
            name = "No name yet";
            GPA = 0;
            credits = 0.0;
            cout << "Default constructor entered!" << endl;
}

student::student(string s, double gpa, int nCredits)
{
            name = s;
            GPA = gpa;
            credits = nCredits;
            cout << "Second constructor entered!" << endl;
 }

 void student::changeCredits(){
 cout << "Enter credits earned: ";
 cin >> credits;
 }

 int student::getCredits(){
   return credits;
 }

 void student::changeGPA(){
  cout << "Enter GPA: ";
  cin >> GPA;
 }

double student::getGPA(){
 return GPA;
 }

void student::displayStRec()
{
         cout << "   Name: " << name <<endl;
        cout << "    GPA: " << GPA <<endl;
        cout << "Credits: " << credits <<endl;
}

student::~student()
{
            cout << "Destructor entered!" << endl;
}

int main()
{
            student s1,s2("John",4.0,42);
            s2.changeCredits();
            s2.getCredits();
            s2.changeGPA();
            s2.getGPA();
            s2.displayStRec();
            return 0;
}

【讨论】:

  • 我认为你在 double 和 int 之间混用:credits = 0.0gpa = 0
【解决方案3】:

这是一个建议的解决方案,但我不知道你的老师要求什么:

!: 将字符串添加到包含中

2:只使用会员数据而不是非会员

3:要么让 changeCredits 和 changeGPA 接受 0 参数并在其内部请求输入,要么在外部输入并传递给它。

    #include <iostream>
#include <string>
using namespace std;

class student
{
    public:
        student();
        student(string s, double gpa, int nCredits);
        ~student(); //destructor

        void   changeCredits();
        int    getCredits();
        void   changeGPA();
        double getGPA();
        void   displayStRec();

    private:
        string name;
        double GPA;
        int    credits;
};

student::student() : 
    name("No name yet"), GPA(0.0), credits(0)
{
    cout << "Default constructor entered!" << endl;
}

student::student(string s, double gpa, int nCredits) : 
    name(s), GPA(gpa), credits(nCredits)
{
    cout << "Second constructor entered!" << endl;
}

void student::changeCredits()
{
    cout << "Enter credits earned:" << endl;
    cin  >> credits;
    cout << endl;
}

int student::getCredits()
{
    return credits;
}

void student::changeGPA()
{
    cout << "Enter GPA: " << endl;
    cin >> GPA;
    cout << endl;
}

double student::getGPA()
{
    return GPA;
}

void student::displayStRec()
{
    cout << "   Name: " << name <<endl;
    cout << "    GPA: " << GPA <<endl;
    cout << "Credits: " << credits <<endl;
}

student::~student()
{
    cout << "Destructor entered!" << endl;
}

int main()
{
    student s1, s2("John", 4.0, 42);
    s2.changeCredits();
    s2.getCredits();
    s2.changeGPA();
    s2.getGPA();
    s2.displayStRec();

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-17
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    相关资源
    最近更新 更多