gpt4 book ai didi

c++ - 数组随机访问 C++

转载 作者:行者123 更新时间:2023-11-27 22:56:05 24 4
gpt4 key购买 nike

我可能会在写这篇文章时把自己搞糊涂了,提前道歉:

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

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

由于这个原因,我无法以正常方式逐步遍历我的数组来显示信息,因为实际对象 Graduate 和 Undergraduate 的大小与 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() 的操作,但在数组上手动执行。

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

最佳答案

你不能像这样在数组中存储不同大小的对象。当您尝试将派生类型(例如Graduate)复制到基类型(例如Student)上时,您会得到所谓的< em>切片,因为对象大小不同(部分可能会被切掉)。

为此,您需要存储 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

关于c++ - 数组随机访问 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32929144/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com