如何在同一个类中同时具有参数化构造函数和默认构造函数
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;
}
学生.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
值,从而导致未定义的行为。
应该使用初始值设定项列表重写构造函数。假设grades
是std::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->firstName
和firstName
都引用同一个变量——相同的成员变量。其他两种说法也是如此。
如果不看这些成员是如何申报的,很难说这是否是你崩溃的原因。但是,这绝对是伪造的代码。
此外,这条线也没有任何用处:
grades[maxGrades];
根据maxGrades
和grades
的声明方式,它很可能是崩溃的根源。
编辑:您对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),然后访问未初始化的指针grades。您需要一种方法将默认值设置为maxGrades,然后您需要为等级进行"新"内存分配。
您的功能
void Student::setMaxGrades(int mGrades)
{
mGrades = maxGrades;
grades[maxGrades];
}
应读取
maxGrades = mGrades;
grades = new double[maxGrades];
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 在按值调用 (c++) 中转发构造函数参数
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 如何在构造函数参数中初始化"std::set"?
- 何时应在构造函数参数中使用 const C++?
- 使用模板化结构作为构造函数参数
- 使用 lambda 作为构造函数参数是否需要C++ 17?
- 如何使输入文本文件成为构造函数参数?c++
- shared_ptr构造函数参数是否应按值传递
- 是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数
- 复制构造函数参数为0
- 用作成员构造函数参数的函数的求值顺序
- 结构中的默认成员值或默认构造函数参数
- C++将引用成员绑定到构造函数参数
- 如何通过可变参数模板将多个构造函数参数转发到数组初始值设定项列表?
- 模板函数指针参数与构造函数参数
- 如何将 std::string 作为构造函数参数传递,并将其保存的 C 字符串存储在 void 指针中?
- 如何基于构造函数参数模板化类成员函数的代码
- 将派生类构造函数参数传递给受保护的成员
- 如何根据构造函数参数使用超类类型初始化成员变量?