我可能会在写这篇文章时感到困惑,提前抱歉:
有没有办法可以使用数组中对象的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 :()。而且我必须使用多态性,这就是为什么我有一个类型学生持有派生类对象的数组指针。
答案 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(...);
这应该有用。