所以这是我的计划。我必须创建一个Student类型的对象,然后让学生“签出”一个项目。我正在使用一个重载的加法运算符来让用户检查该项目。
main.cpp中:
#include <iostream>
#include "Student.h"
using namespace std;
int main() {
Student s(54000, "JOHN", "DOE");
cout << "main:" << endl << (s + "Frisbee") << endl << endl;
system("pause");
return 0;
}
我在头文件中定义了所有类定义,以尝试保持此程序的最小化和简化。
Student.h:
#ifndef STUDENT_H
#define STUDENT_H
#include <fstream>
#include <string>
#include <iostream>
using namespace std;
class Student {
public:
string firstName;
string lastName;
int id;
int itemsCheckedOut;
int size;
string *array;
Student(int id = 0, string firstName = "", string lastName = "") {
Student::firstName = firstName;
Student::lastName = lastName;
Student::id = id;
itemsCheckedOut = 0;
size = 10;
array = new string[size];
}
Student(const Student &other) {
itemsCheckedOut = other.itemsCheckedOut;
array = new string[itemsCheckedOut];
for (int i = 0; i < itemsCheckedOut; i++) {
array[i] = other.array[i];
}
}
~Student() {
delete[] array;
array = NULL;
}
Student &operator=(const Student &rhs) {
if (this != &rhs) {
firstName = rhs.firstName;
lastName = rhs.lastName;
id = rhs.id;
itemsCheckedOut = rhs.itemsCheckedOut;
delete[] array;
array = new string[size];
for (int i = 0; i < itemsCheckedOut; i++) {
array[i] = rhs.array[i];
}
}
return *this;
}
void CheckOut(const string &item) {
array[itemsCheckedOut] = item;
itemsCheckedOut++;
}
friend ostream &operator<<(ostream &output, const Student &student) {
output << student.id << " " << student.firstName << " " << student.lastName << endl;
if (student.itemsCheckedOut != 0) {
output << student.itemsCheckedOut;
for (int i = 0; i < student.itemsCheckedOut; i++) {
output << " " << student.array[i] << endl;
}
}
else {
output << 0;
}
return output;
}
const Student operator+(const string &item) {
Student s;
s = *this;
s.CheckOut(item);
cout << "class:" << endl << s << endl << endl;
return s;
}
};
#endif
输出:
class:
54000 JOHN DOE
1 Frisbee
main:
-858993460
1 Frisbee
正如你所看到的,从主要的,它输出错误的东西。它不是输出id后跟两个空格,而是输出名字和姓氏,而是输出数字:-858993460。这必须是某种内存泄漏问题,但我很确定我的拷贝构造函数,重载赋值运算符和解构函数都已正确定义,但你可以看看它们。
我很感激任何帮助,因为我在这里非常绝望。感谢。
答案 0 :(得分:1)
您的实际
savefile = asksaveasfilename(filetypes=(("Excel files", "*.xlsx"),
("All files", "*.*") ))
看起来是正确的。但是你的copy-constructor和assignment-operator中有一些错误会导致它出现故障:
operator+
,size
或名称。 id
个项目,而不是[size]
。[itemsCheckedOut]
。size
。它需要检测这种情况并拒绝结账或分配更多空间。 (我上次你发表关于这个项目的问题时提到了这个)答案 1 :(得分:0)
您应该用std :: vector替换字符串*数组。它将为您处理内存管理,使您的代码比您当前使用的手动内存管理更容易,更容易出错。如果您担心在添加项目时进行分配,则可以保留初始大小10(尽管数据量很小,不应该成为问题)。
答案 2 :(得分:0)
它调用复制构造函数:
Student(const Student &other) {
itemsCheckedOut = other.itemsCheckedOut;
array = new string[itemsCheckedOut];
for (int i = 0; i < itemsCheckedOut; i++) {
array[i] = other.array[i];
}
}
但是您忘记复制其正文中的所有学生字段。 您可以覆盖默认的复制构造函数,因此您应该手动执行所有数据复制,如赋值运算符。