c++ - 如何在同一个类中同时拥有参数化构造函数和默认构造函数?

标签 c++ function class

我正在尝试编写一个名为 student 的类,其中包含参数化构造函数和默认构造函数,参数化版本工作正常,但每当我在手动分配值后尝试运行默认构造函数时,控制台就会崩溃。

学生.cpp:

Student::Student()
{
    this -> firstName = firstName;
    this -> lastName = lastName;
    this -> maxGrades = maxGrades;
    grades[maxGrades];
}

Student::Student(string fName, string lName, int mGrades)
{
    firstName = fName;
    lastName = lName;
    maxGrades = mGrades;
    grades[maxGrades];
}

Student::~Student()
{

}

void Student::setFirstName(string fName)
{
    firstName = fName;
}

void Student::setLastName(string lName)
{
    lastName = lName;
}

void Student::setMaxGrades(int mGrades)
{
    mGrades = maxGrades;
    grades[maxGrades];
}

string Student::getFirstName()
{
    return firstName;
}

string Student::getLastName()
{
    return lastName;
}

void Student::addGrade(int currentGradeNumber, double addedGrade)
{
    if(currentGradeNumber < maxGrades)
    {
        grades[currentGradeNumber] = addedGrade;
        cout << "grade " << currentGradeNumber << "is " << grades[currentGradeNumber] << endl;
    }
}

double Student::calcAvg()
{
    double sum = 0;
    double avg = 0;
    for(int i=0; i < maxGrades;i++)
    {
        sum += grades[i];
    }
    avg = sum/maxGrades;
    return avg;
}

学生测试.cpp:

int main()
{
    Student student1("Bill", "Nye", 3);
    cout << "First Name: " << student1.getFirstName() << endl;
    cout << "LastName: " << student1.getLastName() << endl;
    student1.addGrade(0, 90);
    student1.addGrade(1, 95);
    student1.addGrade(2, 80);
    cout << "Average is " << student1.calcAvg() << endl;

    Student student2;
    student2.setMaxGrades(2);
    student2.setFirstName("Frank");
    student2.setLastName("West");
    cout << "\nFirst Name: " << student2.getFirstName() << endl;
    cout << "Last Name: " << student2.getLastName() << endl;
    student2.addGrade(0,50);
    student2.addGrade(1,100);
    cout << "Average is: " << student2.calcAvg();
    return 0;
}

学生.h:

class Student
{
    private:
        string firstName;
        string lastName;
        int maxGrades;
        int numGrades;
        double grades[];
    public:
        Student();
        Student(string, string, int);
        ~Student();
        void setFirstName(string);
        void setLastName(string);
        string getFirstName();
        string getLastName();
        void addGrade(int, double);
        double calcAvg();
        void setMaxGrades(int);
};

student1 对象运行良好,但当我尝试对 student2 使用 addGrade() 或 calcAvg() 时出现错误。任何帮助将不胜感激。

最佳答案

当他们这样做时,你的两个构造函数都是不正确的:

grades[maxGrades]; // This does not do what you think it does

此行不会在参数化构造函数中崩溃,因为 maxGrades有一个已知值。但是,您的默认构造函数重用了未初始化的值 maxGrades ,导致未定义的行为。

您应该使用初始化列表重写您的构造函数。假设gradesstd::vector<int> ,你可以这样做:

Student::Student() : maxGrades(0)
{
// The remaining members will be initialized, because they have constructors.
}

Student::Student(string fName, string lName, int mGrades)
:   firstName(fName)
,   lastName(lName)
,   maxGrades(mGrades)
,   grades(mGrades, 0)
{
}

关于c++ - 如何在同一个类中同时拥有参数化构造函数和默认构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20510323/

相关文章:

c++ - Eigen: 逗号初始化动态矩阵

c++ - 好友功能看不到私有(private)成员

python - 如何获取未初始化实例的属性?

Python:将字符串转换为函数名; getattr 还是等于?

c++函数解析选择模板化版本而不是普通函数

java - 公共(public)类需要公共(public)成员(访问成员时)?

Java:比较两个类列表,无论顺序如何

ZeroMemory 的 C# 等效代码

c++ - 有人能给我提供一个设置和检索 unique_ptr 的简单示例吗

c++ - 如何编写模板函数来创建给定 const char* 的 char/wchar_t 字符串?