数组随机访问C ++

时间:2015-10-04 01:22:37

标签: c++ polymorphism dynamic-arrays derived-class dynamic-cast

我可能会在写这篇文章时感到困惑,提前抱歉:

有没有办法可以使用数组中对象的sizeof()来访问指针的动态数组中的位置(递增数组指针)?

例如: 我有一个动态数组类型基类Student填充了派生类对象(研究生,本科生)。

由于这个原因,我不能以正常方式逐步浏览我的数组以显示信息,因为实际对象研究生和本科生的大小与学生不同。当实际对象较大时,每个数组步骤将移动sizeof(Student)

取决于我正在做的学生类型(这是针对毕业生):

Student *student = new Graduate(undergrad, fName, lName, major, idNum, arr2, cSize, 
        degreeType, thesis);
arr[i] = student;

声明arr的地方:Student *arr = new Student[size];

使用我的数组我在for循环中创建了这个:

if (!students[i].getGradStatus()){
    handleGraduate(&students[i], i);
    step = step + sizeof(Graduate);
}
else if (students[i].getGradStatus()){
    handleUndergraduate(&students[i], i);
    step = step + sizeof(Undergraduate);
}

我试图想出一种改变步长的方法。我不认为这将适用于for循环,但while循环可能会有所不同。我试图尝试类似于文件seekg(),但是在数组上手动操作。

正如我已经注意到每个人都喜欢质疑动态数组在向量上的使用,所以我只想说我不能在这个项目中使用向量(不允许STL :()。而且我必须使用多态性,这就是为什么我有一个类型学生持有派生类对象的数组指针。

3 个答案:

答案 0 :(得分:2)

您无法在数组中存储不同大小的对象。当您尝试将{em>派生类型(例如Graduate)复制到基本类型(例如Student)时,您会得到所谓的切片因为对象大小不同(部件可能会被切断)。

要执行此操作,您需要存储Student*(指向Students的指针。)

class Student
{
    std::string name;
public:
    Student(const std::string& name): name(name) {}
    virtual ~Student() {} // virtual destructor

    virtual void handle() = 0; // implementation must override this

    std::string get_name() const { return name; }
};

class Graduate
: public Student
{
public:
    Graduate(const std::string& name): Student(name) {}
    virtual void handle() { std::cout << "Handling Graduate" << '\n'; }
};

class UnderGraduate
: public Student
{
public:
    UnderGraduate(const std::string& name): Student(name) {}
    virtual void handle() { std::cout << "Handling UnderGraduate" << '\n'; }
};

int main()
{
    Student** students = new Student*[3];

    students[0] = new Graduate("Wendy");
    students[1] = new UnderGraduate("Bob");
    students[2] = new Graduate("Rachel");

    for(int i = 0; i < 3; ++i)
    {
        std::cout << students[i]->get_name() << '\n';
        students[i]->handle(); // polymorphic function (virtual)
    }

    delete[] students; // clean up or (better) use a smart pointer
}

<强>输出:

Wendy
Handling Graduate
Bob
Handling UnderGraduate
Rachel
Handling Graduate

答案 1 :(得分:1)

将您的数组更改为Student指针数组而不是Student对象。

 Student **arr = new Student*[size];

当你这样做时,你的对象将存在于堆上并且指针大小总是相同的,所以你遇到的问题就会消失。

答案 2 :(得分:1)

因为你可以写,我认为它可以实例化学生(非衍生)。这很糟糕,因为你要将数学中的派生对象存储在你的学生中(贫困学生!)。为了抵制你用实例类型的大小做奇怪的事情。只是不要。

改为创建一系列学生指针,Student **arr。指针具有固定的大小,它们将指向任何衍生类型的学生,因此您不必担心它们的大小。

Student **student = new Student*[size];
...
student[i] = new Graduate(...);

这应该有用。