2012-08-23 181 views
1

C++新手在这里,这是我的第一篇文章。我在学校的一个项目上工作,我有点卡住了。我的任务是创建一个课程名册。每个名册将包含课程名称,课程代码,课程学分和教授姓名。没问题,我有一个花名册班。问题是我不确定如何制作一个对象数组动态,因为它必须能够在用户请求时增长和缩小。我对动态数组一般比较熟悉,但不确定动态数组对象的语法。而且,按照教授的指示,载体不是的选项。我搜索了这个论坛以及在互联网上的其他领域,并没有找到答案,或者我不理解我找到的答案,并认为我会在这里发布。以下是我的非动态数组对象的代码。帮助转换为动态数组将非常感激。谢谢!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

你给'linklists'有什么想法吗? –

回答

0

为了生长或收缩阵列由用户的要求,进行所希望的大小的一个新的数组,并且由一个复制了一个元件。这是一个O(n)操作,但除非您明确地在栈上声明它,或者使用new或带指针的malloc,否则您无法访问内存。

无论如何,您只需制作所需的后期增长/缩小后尺寸的第二个数组。我建议使用new/malloc,这样你可以将你的指针移动到新创建的数组中。另外,我建议在将阵列复制到新阵列后清理阵列中的内存。

也可以考虑不同的数据结构,例如链接列表。

+0

谢谢柯比。我熟悉与它相关的过程和语法,例如数据类型int。在我的情况下,这与数据类型名册相同吗?换句话说,动态数组对象的语法是什么?我宁愿使用新的/删除[]操作。 – user1618639

+0

看看这个问题的选定答案:http://stackoverflow.com/questions/255612/dynamically-allocating-an-array-of-objects – Kirby

+0

谢谢,柯比。在我发布之前,我确实看到了这篇文章,并没有完全遵循。我会再看一遍(在白天而不是早上3点),看看它是否陷入。 – user1618639

1

我认为你将不得不实现自己的数据结构,据我所知,C++本质上不支持这个,这就是为什么我们使用向量。

对于这种类型的问题,我们必须实现自己的数据结构,我认为linklist将是一个合适的解决方案。

这可能是vectors是如何在内部实现的,它们是不同的解决方案。

基本上LinkList是由连接节点组成的一个特殊的数据结构,把它想象成一个链,每个元素都有一个值,在这种情况下是一个名册,还有一个链接到下一个元素和/或一个链接到前一个元素等等......所以如果你想添加一个元素,你可以简单地将它添加到最后或开始它到你,如果你想删除一个元素,只需剪切它并连接两个元素与一系列更像棒子的物体形成鲜明对比,您无法真正将任何东西添加到任何一端,即使可以,也无法真正切割,您可以真正将其连接在一起,无缝连接。

链接列表有很多变化,但这是它的要点。

在另一方面,如果你想使用dynamic arrays你将必须手动所有的值复制到新的更大的阵列,并摧毁了以前的一个,这是真的昂贵,可以说是相当危险的根本您需要实现一个我们可以使用memcpy的拷贝构造函数,但是如果我们的对象持有引用或者指向其他对象的指针,那么这会非常危险,在这种情况下,如果它们被删除了,我们会指向不好的值。

另请注意,如果您未提供一个,默认构造函数,复制构造函数,赋值运算符,C++编译器将插入以下内容,所有这些操作符都可能或可能不会按预期方式工作,具体取决于基础成员,例如总是明智的实现我们自己的,在这种情况下你的确定,即你没有任何原始指针,但是当运行时错误开始出现并且你不知道为什么时要记住。

+0

我没有想过尝试链接列表。我们还没有在我的C++类中学到,但是我从我的Java类中获得了一些。我会给你一个镜头并发布结果。谢谢! – user1618639

+0

我看,没问题,这是数据结构,还是编程介绍? –

+0

这是介绍编程,第二学期。 – user1618639