[英]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.