C ++新手在这里,这是我的第一篇文章。我正在学校的一个项目,我有点卡住了。我的任务是创建一个课程名单。每个名单将包含课程名称,课程代码,课程学分和教授姓名。没问题,我有一个名册课。问题是我不确定如何使对象数组成为动态的,因为它必须能够在用户请求时增长和缩小。我对动态数组有一定的了解,但不确定动态对象数组的语法。而且,根据教授的指示,向量不是一个选项。我搜索了这个论坛以及互联网上的其他区域,但没有找到答案,或者我不理解我找到的答案,并且认为我会在这里发布。以下是我的非动态对象数组的代码。转换为动态数组的帮助将非常感激。谢谢!
StudentEnrollment.h:
#ifndef STUDENTENROLLMENT_H
#define STUDENTENROLLMENT_H
# include <iostream>
# include <string>
using namespace std;
class Roster {
private:
string courseName;
string courseCode;
string courseCredits;
string professorName;
public:
void setCourseName ( string );
void setCourseCode ( string );
void setCourseCredits ( string );
void setProfessorName ( string );
string getCourseName();
string getCourseCode();
string getCourseCredits();
string getProfessorName();
Roster ();
};
#endif;
StudentEnrollment.cpp:
#include <iostream>
#include <string>
#include "StudentEnrollment.h"
using namespace std;
// Roster class implementation
Roster::Roster () {
courseName = "";
courseCode = "";
courseCredits = "";
professorName = "";
}
void Roster::setCourseName ( string cn ) {
courseName = cn;
}
void Roster::setCourseCode ( string c ) {
courseCode = c;
}
void Roster::setCourseCredits ( string cc ) {
courseCredits = cc;
}
void Roster::setProfessorName ( string pn ) {
professorName = pn;
}
string Roster::getCourseName() {
return courseName;
}
string Roster::getCourseCode() {
return courseCode;
}
string Roster::getCourseCredits() {
return courseCredits;
}
string Roster::getProfessorName() {
return professorName;
}
main.cpp中:
#include <iostream>
#include <string>
#include "StudentEnrollment.h"
using namespace std;
int main (int argc, char * const argv[]) {
int number_of_rosters = 0;
string course, code, credits, name;
cout << "Enter the number of rosters you would like to create: ";
cin >> number_of_rosters;
cin.ignore(100, '\n');
Roster roster[number_of_rosters];
for ( int i = 0; i < number_of_rosters; i++){
cout << "Enter course name: ";
getline(cin,course);
roster[i].setCourseName(course);
cout << "Enter course code; ";
getline(cin, code);
roster[i].setCourseCode(code);
cout << "Enter course credits: ";
getline(cin, credits);
roster[i].setCourseCredits(credits);
cout << "Enter professor name: ";
getline(cin, name);
roster[i].setProfessorName(name);
cout << "Next course..." << endl;
}
cout << endl;
for ( int i = 0; i < number_of_rosters; i++){
cout << roster[i].getCourseName() << endl;
cout << roster[i].getCourseCode() << endl;
cout << roster[i].getCourseCredits() << endl;
cout << roster[i].getProfessorName() << endl;
cout << endl;
}
return 0;
}
如果格式不正确,请原谅我。这是我的第一篇文章。
亚瑟
答案 0 :(得分:1)
我认为你将不得不实现自己的数据结构,据我所知,c ++本身并不支持这个,这就是我们使用向量的原因。
对于这类问题,我们必须实现自己的数据结构,我认为linklist是一个合适的解决方案。
这可能是vectors
在内部实施的方式,它们是不同的解决方案。
基本上,LinkList是一个由连接节点组成的特殊数据结构,可以将其视为一个链,其中每个元素都包含一个值,在本例中是一个名册,以及指向下一个元素和/或链接的链接。前面的元素等等...所以如果你想添加一个元素你可以简单地将它添加到结尾或者它的开头,如果你想删除一个元素只需剪切它并将两个元素连接在一起与一组更像棒子的物体形成鲜明对比,你无法在两端真正添加东西,即使可以,也无法真正切割,你可以真正地将它连接在一起,无缝连接。
链接列表有很多变化,但这就是它的要点。
另一方面,如果你想使用dynamic arrays,你将手动将所有值复制到新的更大的数组中,并销毁前一个,这真的贵从根本上来说,您可能需要实现一个我们可以使用memcpy
的复制构造函数,这可能非常危险但如果我们的对象持有对其他对象的引用或指针,这可能会非常危险,在这种情况下,如果它们被删除了我们会指出坏的价值观。
另请注意,如果您不提供一个,默认构造函数,复制构造函数,赋值运算符,c ++编译器将插入以下内容,所有这些都可能会或可能不会按预期工作,具体取决于底层成员,因此它总是如此明智地实现我们自己的,在这种情况下你的确定,即你没有任何原始指针,但是当运行时错误开始出现并且你不知道为什么时要记住这些。
答案 1 :(得分:0)
要根据用户的请求增大或缩小数组,请创建所需大小的新数组,然后逐个复制元素。这是一个O(n)操作,但你没有访问内存,除非你在堆栈上显式地声明它,或者使用带有指针的new或malloc。
在任何情况下,您都可以制作所需的后期成长/后缩小尺寸的第二个数组。我建议使用new / malloc,以便您可以将变量的指针移动到新创建的数组。另外,我建议在将内存复制到新内存后清理内存。
也可以考虑使用不同的数据结构,例如链表。