1

我以前运行过这个程序,它运行良好。然后我将“if”语句添加到“set”方法中,当我运行程序时我开始看到非常大的数字。我能做些什么来解决这个问题,或者有人能告诉我为什么会这样吗?

class GradeBook{

public: 
    void setStudentID(int ID){

        if(10000 <= studentID && studentID <= 50000){

            studentID = ID;
        }
    }

    int getStudentID(){

        return studentID;
    }

    void setStudentGrade(int grade){

        if(0 <= studentGrade && studentGrade <= 100){

        studentGrade = grade;
        }
    }

    int getStudentGrade(){

        return studentGrade;
    }

    void displayMessage(){

        cout << "Student " << getStudentID() << " has a score of " << getStudentGrade() << endl;
    }

private:

    int studentGrade;
    int studentID;
};

int main(){

    int nameOfID;
    int nameOfGrade;
    GradeBook gb;

    cout << "Please enter a student ID: " << endl;
    cin >> nameOfID;
    gb.setStudentID(nameOfID);
    cout << "Please enter the student's grade: " << endl;
    cin >> nameOfGrade;
    gb.setStudentGrade(nameOfGrade);
    getchar();

    gb.displayMessage();
    getchar();
}
4

4 回答 4

1

两个猜测(我的 C++ 不太好):

  1. 您的变量未初始化;如果 if 表达式的计算结果不为 true,则私有变量将永远不会设置为任何值。“大数”只是碰巧在存储变量的内存中的随机值。
  2. 您正在使用 cin 读取字符串并将它们的指针传递给 set-methods。“大数”实际上是指针地址的(可能是一些乱码表示)。

编辑:实际上,忘记 2;似乎表明它应该起作用。我的 C++ 有点生锈了 ;-)

于 2012-04-05T00:39:49.777 回答
1
  1. 你的意思是你的比较是错误的。

    if(10000 >= studentID && studentID <= 50000)
    
  2. 您没有其他语句来确保变量已初始化,因此我将其更改为:

    if(10000 >= studentID && studentID <= 50000){
         studentID = ID;
    }
    else{
         studentID = 0; //or whatever value you want to mean invalid
    }
    

    这有望解决您的问题。

于 2012-04-05T00:44:19.443 回答
0

我注意到的第一件事是你的 ivars 没有被初始化,所以如果设置器中的输入没有验证,那么你已经确定的行为是可以预料的。

您应该创建一个默认构造函数并将两个变量初始化为 0。

于 2012-04-05T00:42:09.520 回答
0

当您定义 GradeBook gb 时,私有字段(studentGrade 和 studentID)未初始化。然后,gb.setStudentID 尝试读取 studentID。studentID 将是随机值。

于 2012-04-05T00:43:56.040 回答