繁体   English   中英

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

[英]How can I have both a parameterized and a default constructor in the same class?

我正在尝试编写一个名为Student的类,该类同时具有参数化的和默认的构造函数,并且该参数化的版本可以正常工作,但是在我手动分配值后尝试运行默认构造函数时,控制台崩溃。

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;
}

studentTest.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;
}

student.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)
{
}

这没有任何用处:

this -> firstName = firstName;
this -> lastName = lastName;
this -> maxGrades = maxGrades;

因为您在类的方法中,所以this->firstNamefirstName引用相同的变量-相同的成员变量。 对于其他两个语句也是如此。

不了解这些成员如何声明,很难说这是否是导致崩溃的原因。 但是,这绝对是伪代码。

此外,此行也没有任何用处:

grades[maxGrades];

并且取决于maxGradesgrades的声明方式,很可能是崩溃的根源。

编辑:您的grades声明看起来一点也不好,因为它没有为成绩分配任何存储空间。 您应该考虑在此处使用std::vector<double> ,或者至少指定一个大于要使用的最大数据集的最大大小。 (例如, double grades[100]; ),但请认真考虑这里的std::vector<double>

在默认构造函数中,应为初始化程序列表中的每个成员分配合理的默认值。 像这样:

Student::Student() :
    firstName(""),
    lastName(""),
    maxGrades(0),
    numGrades(0)
{
}

构造函数被调用,并且其中的任何内容在创建对象后即被初始化。 仅在创建对象后才将值分配给first,maxgrade等。 我认为这是不对的。

由于grades只是一个指针,因此您无需使用构造函数“ grades [maxGrades];”行为其分配内存。 您必须执行诸如grades = new double [maxGrades]之类的操作,并且只能对已定义的maxGrades(未在默认构造函数中定义)进行操作。 您可以将平均值除以零(如果maxGrades = 0),然后访问未初始化的指针,即成绩。 您需要一种将默认值设置为maxGrades的方法,然后需要对成绩进行“新的”内存分配。

您的职能

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

应该读

maxGrades = mGrades; 
grades = new double[maxGrades];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM