簡體   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