从同一类中的另一个方法调用方法时出错
Error with calling a method from another method in the same class
我似乎无法弄清楚我正在尝试构建的这个 GPA 计算器程序是怎么回事。问题出在Student
类的printTranscript
方法上。该方法调用同一类getGPA
方法,该方法返回双精度值,输出是某个大数字而不是标准 GPA。
主.cpp:
#include <iostream>
#include "Student.cpp"
using namespace std;
int main(){
Student stud("Lebron", 23232);
stud.addCourse("Passing", 3, 'A');
stud.addCourse("Finals Record", 4, 'D');
stud.printTranscript();
return 0;
}
学生.h:
#include "Course.h"
#include <vector>
class Student{
private:
string name;
int studentID;
vector<Course> courses;
public:
Student(){
name = "No Name";
studentID = 0;
}
Student(string n, int ID){
name = n;
studentID = ID;
}
string getName(){
return name;
}
void setName(string n){
name = n;
}
int getID(){
return studentID;
}
void setID(int ID){
studentID = ID;
}
void addCourse(string, int, char);
void addCourse(Course);
double getGPA();
void printTranscript();
};
学生.cpp:
#include "Student.h"
void Student::addCourse(string name, int credits, char grade){
courses.push_back(Course(name,credits,grade));
}
void Student::addCourse(Course c){
courses.push_back(c);
}
double Student::getGPA(){
double gradePoints, totalCredits;
for(int i = 0; i < courses.size(); i++){
if(courses[i].getGrade() == 'A'){
gradePoints += (4.0 * courses[i].getCredits());
totalCredits += courses[i].getCredits();
}
else if(courses[i].getGrade() == 'B'){
gradePoints += (3.0 * courses[i].getCredits());
totalCredits += courses[i].getCredits();
}
else if(courses[i].getGrade() == 'C'){
gradePoints += (2.0 * courses[i].getCredits());
totalCredits += courses[i].getCredits();
}
else if (courses[i].getGrade() == 'D'){
gradePoints += (1.0 * courses[i].getCredits());
totalCredits += courses[i].getCredits();
}
}
return (gradePoints / totalCredits);
}
void Student::printTranscript(){
cout << "Transcript for: " << name << endl;
cout << "============================" << endl;
for(int i = 0; i < courses.size(); i++){
cout << "Course: " << courses[i].getID() << endl;
cout << "Grade: " << courses[i].getGrade() << endl;
cout << endl;
}
cout << "Overall GPA: " << getGPA() << endl;
}
课程:
#include <iostream>
#include <string>
using namespace std;
class Course{
private:
string courseID; // Course name
int numCredits; // Instructor
char letterGrade; // Textbook
public:
Course(string ID, int credits, char grade){ // Assign the course name.
courseID = ID;
numCredits = credits;
letterGrade = grade;
}
string getID(){
return courseID;
}
void setID(string ID){
courseID = ID;
}
int getCredits(){
return numCredits;
}
void setCredits(int credits){
numCredits = credits;
}
char getGrade(){
return letterGrade;
}
void setGrade(char grade){
letterGrade = grade;
}
};
很抱歉代码很长,但我似乎无法弄清楚为什么 main 中的输出会给我:
Transcript for: Lebron James
============================
Course: Passing
Grade: A
Course: Finals Record
Grade: D
Overall GPA: 2.2321e+230
如果我在主类中将stud.getGPA作为一个单独的语句,它工作正常。当从同一类的另一个方法调用时,这里输出的大量数字是什么,以及如何解决这个问题?
很抱歉代码很长,但我不想错过任何东西,因为我仍处于C++的开始阶段。
来自 dcl.init/7:
默认初始化 T 类型的对象意味着:
如果 T 是(可能符合 cv 条件的)类类型,则考虑构造函数。枚举适用的构造函数 ([over.match.ctor]),并选择初始值设定项 () 的最佳一个 通过过载解析。这样选择的构造函数称为, 使用空参数列表来初始化对象。
如果 T 是数组类型,则默认初始化每个元素。
否则,不执行初始化。
您直接在+=
执行一些操作:
totalCredits += courses[i].getCredits();
但忘记初始化变量。不要假设最初所有内容都将设置为zero
。
因此,将totalCredits
初始化为0.0
。
添加-Wuninitialized
:
如 @1201ProgramAlarm 建议的那样,使用-Wuninitialized
标记未初始化的变量。
warning: 'totalCredits' may be used uninitialized in this function [-Wuninitialized]
如果要将警告视为错误,只需添加标志-Werror
相关文章:
- C++从另一个类访问公共静态向量的正确方法是什么
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 在另一个类视图中添加最多2个图表的正确方法是什么
- 检查哪个对象调用了另一个对象的对象方法
- 不能将方法返回的值用于另一个方法
- Qt将信号与另一个类方法连接
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 将一个类的方法指针存储到另一个类中
- 从另一个标头中的标头调用静态方法
- 无法"this"指针传递到另一个类并在 CPP 中调用该类的任何方法
- C++ |DLL / EXE - 如何从导出的类调用另一个类方法?
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 如果类"A"具有指向另一个类的指针,则"B" A 可以访问 B 类公共方法
- 如何在另一个类中使用类成员的正确方法?
- 重写另一个方法 [C++] 使用的超类回调函数
- 如何构造一个类型特征,可以判断一个类型的私有方法是否可以在另一个类型的构造函数中调用?
- 如何启用使用另一个类的静态方法的模板函数的自动推导,从而消除冗长的调用方代码
- 覆盖作为另一个类的好友的虚拟受保护方法
- 将vector<vector<double>>从x86平台中创建的一个进程发送到x64中构建的另一个进程的最快方法是什么
- 返回一个引用C++中另一个类对象的对象的有效方法