1

这里是 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;
}

主.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;
}

如果格式不正确,请原谅我。这是我的第一篇文章。

亚瑟

4

2 回答 2

1

我认为您将不得不实现自己的数据结构,据我所知,c++ 本身并不支持这一点,这就是我们使用向量的原因。

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

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

从根本上说,LinkList 是一种由连接节点组成的特殊数据结构,可以将其视为一个链,其中每个元素都有一个值,在这种情况下是一个名册,以及到下一个元素的链接和/或到前一个元素的链接依此类推......所以如果你想添加一个元素,你可以简单地将它添加到末尾或开头,这取决于你,如果你想删除一个元素,只需剪切它并将两个元素连接在一起,对比一组更像是一根棍子的对象,你不能真正在两端添加东西,即使可以,你也不能真正切割,你可以真正将它们无缝地连接在一起。

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

另一方面,如果您想使用动态数组,您将手动将所有值复制到新的较大数组中,并销毁前一个数组,这真的很昂贵,而且从根本上来说可能非常危险,您将需要实现一个我们可以使用的复制构造函数,memcpy但是如果我们的对象持有指向其他对象的引用或指针,这可能会非常危险,在这种情况下,如果它们被删除,我们将指向错误的值。

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

于 2012-08-23T18:30:39.280 回答
0

要根据用户的要求扩大或缩小数组,请创建一个具有所需大小的新数组,并将元素一个接一个地复制。这是一个 O(n) 操作,但您无权访问内存,除非您在堆栈上显式声明它,或者使用带有指针的 new 或 malloc。

在任何情况下,您都可以制作第二个所需的增长后/收缩后大小的数组。我建议使用 new/malloc 以便您可以将变量指针移动到新创建的数组。另外,我建议在将内存复制到新内存后清理数组中的内存。

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

于 2012-08-23T18:13:08.147 回答