繁体   English   中英

数组随机存取C ++

[英]Array Random Access C++

在写这篇文章时,我可能会迷惑自己,预先对不起:

有没有一种方法可以使用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 :()。我必须使用多态性,因此为什么要使用学生类型的数组指针,其中包含派生类对象。

您不能在这样的数组中存储大小不同的对象。 当您尝试将派生类型(例如“ 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

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

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

当您这样做时,对象将驻留在堆上并且指针大小始终相同,因此您遇到的问题将消失。

既然可以这样写,我假设可以实例化一个Student(非派生)。 不好,因为您要将派生的对象存储在数组中,您的学生将被切片(可怜的学生!)。 为了解决这个问题,您正在根据实例类型的大小进行操作。 只是不要。

改用学生指针数组Student **arr 指针的大小是固定的,它们将指向任何派生类型的学生,因此您不必担心它们的大小。


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

这应该工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM