Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在同一个类中同时具有参数化构造函数和默认构造函数?_C++_Function_Class - Fatal编程技术网

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

C++ 如何在同一个类中同时具有参数化构造函数和默认构造函数?,c++,function,class,C++,Function,Class,我正在尝试编写一个名为student的类,该类中同时包含一个参数化构造函数和一个默认构造函数,参数化版本工作正常,但每当我在手动赋值后尝试运行默认构造函数时,控制台就会崩溃 Student.cpp: Student::Student() { this -> firstName = firstName; this -> lastName = lastName; this -> maxGrades = maxGrades; grades[maxGra

我正在尝试编写一个名为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;
}

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

这没有任何用处:

this -> firstName = firstName;
this -> lastName = lastName;
this -> maxGrades = maxGrades;
因为您在类的方法中,所以
this->firstName
firstName
都引用相同的变量和相同的成员变量。其他两个语句也是如此

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

此外,这一行也没有什么用处:

grades[maxGrades];
根据
maxGrades
grades
的声明方式,它很可能是崩溃的根源

编辑:您对
成绩的声明看起来一点也不好,因为它没有为成绩分配任何存储空间。你应该考虑使用<代码> STD::vector ,或者至少指定一个比你要处理的最大数据集更大的最大大小。(例如<代码>双级[100 ];)但请认真考虑<代码> STD::向量< /代码>。

在默认构造函数中,应该为初始值设定项列表中的每个成员分配合理的默认值。大概是这样的:

Student::Student() :
    firstName(""),
    lastName(""),
    maxGrades(0),
    numGrades(0)
{
}
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->firstName
firstName
都引用相同的变量和相同的成员变量。其他两个语句也是如此

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

此外,这一行也没有什么用处:

grades[maxGrades];
根据
maxGrades
grades
的声明方式,它很可能是崩溃的根源

编辑:您对
成绩的声明看起来一点也不好,因为它没有为成绩分配任何存储空间。你应该考虑使用<代码> STD::vector ,或者至少指定一个比你要处理的最大数据集更大的最大大小。(例如<代码>双级[100 ];)但请认真考虑<代码> STD::向量< /代码>。

在默认构造函数中,应该为初始值设定项列表中的每个成员分配合理的默认值。大概是这样的:

Student::Student() :
    firstName(""),
    lastName(""),
    maxGrades(0),
    numGrades(0)
{
}
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)
{
}

一旦创建了对象,就会调用构造函数并初始化其中的任何内容。仅在创建对象后,才将值指定给first、maxgrade等。我认为这是不对的。

一旦创建了对象,就会调用构造函数并初始化其中的任何内容。仅在创建对象后,才将值指定给first、maxgrade等。我认为这是不对的。

您的两个构造函数在这样做时都是不正确的:

grades[maxGrades]; // This does not do what you think it does
此行在参数化构造函数中不会崩溃,因为
maxGrades
具有已知值。但是,默认构造函数重用未初始化的值
maxGrades
,从而导致未定义的行为

您应该使用初始值设定项列表重写构造函数。假设
grades
std::vector
,您可以这样做:

Student::Student() :
    firstName(""),
    lastName(""),
    maxGrades(0),
    numGrades(0)
{
}
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)
{
}

两个构造函数执行此操作时都不正确:

grades[maxGrades]; // This does not do what you think it does
此行在参数化构造函数中不会崩溃,因为
maxGrades
具有已知值。但是,默认构造函数重用未初始化的值
maxGrades
,从而导致未定义的行为

您应该使用初始值设定项列表重写构造函数。假设
grades
std::vector
,您可以这样做:

Student::Student() :
    firstName(""),
    lastName(""),
    maxGrades(0),
    numGrades(0)
{
}
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)
{
}

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

你的职能

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

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

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

你的职能

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

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

是的,但是默认构造函数没有意义,实际上没有初始化任何东西。共享实际错误消息怎么样?您可以共享头文件吗?这样我们就可以看到类的成员是如何声明的?另外,所有
grades[maxGrades]
都不是有效的数组分配,而是无操作(可能有未定义行为的提示)@JoeZ我在编辑中添加了头文件。@EdS编译器中没有错误消息,我只是得到student.exe已从windows停止工作。是的,但是默认构造函数没有意义,实际上没有初始化任何内容。共享实际的错误消息怎么样?您可以共享头文件吗?这样我们就可以看到类的成员是如何声明的?另外,所有
grades[maxGrades]
都是