簡體   English   中英

了解指向 c++ 中 object 的指針數組

[英]Understanding an array of pointers to an object in c++

有3種類型的飛機。

  • 最大容量為 10 個容器的 nA321
  • nB777 最大容量為 32 個集裝箱
  • nB787 最大容量為 40 個集裝箱

我想對列表進行索引並創建一個 Airplane object 並存儲相應的值。 我的 for 循環將創建一個新的 Airplane object 並設置為 10。我如何動態地將各個飛機類型設置為相應的最大容量? 代碼目前輸出地址,例如:

飛機 1 最大載荷 0xffe

我正在嘗試打印以下內容:

Airplane 1 maximum load 10
Airplane 2 maximum load 10
Airplane 3 maximum load 10
Airplane 4 maximum load 10
Airplane 5 maximum load 32
Airplane 6 maximum load 32
Airplane 7 maximum load 40

我的代碼

#include <iostream>

using namespace std;

class Airplane
{
    public:
        Airplane(int n); // the maximum capacity of the airplane
        int maxLoad(void) const;
        int currentLoad(void) const;
        bool addContainers(int n);
    private:
        const int maxContainers;
        int numContainers;
};

Airplane::Airplane(int n):maxContainers(n){
    n = maxContainers;
}

int Airplane::maxLoad(void) const{
    return maxContainers;
}

int Airplane::currentLoad(void) const{
    return numContainers;
}

class Airline
{
    public:
        Airline(int nA321, int nB777, int nB787);
        ~Airline(void);
        void addShipment(int size);
        void printSummary(void) const; // prints a list of airplanes with their current and maximum load.
    
    private:
        const int nAirplanes; // total # of airplanes used by airline
        Airplane** airplaneList; // array of pointers to Airplane objects
};
  
Airline::Airline(int nA321, int nB777, int nB787):nAirplanes(nA321 + nB777 + nB787){
    airplaneList = new Airplane*[nAirplanes];
    for ( int i = 0; i < this->nAirplanes; i++ ){
        airplaneList[i] = new Airplane(10);
        airplaneList[i] -> maxLoad();
        cout << "Airline " << i+1 << " maximum load " << airplaneList[i] << endl;
    }
}

Airline::~Airline(void){}

int main(void)
{
    // create an Airline with 4 A321, 2 B777 and 1 B787
    Airline airline(4,2,1);
    cout << "Assignment complete" << endl;
}

您可以使用運行時多態性:

  • 讓你的Airplane class 純虛擬,這樣你就不能真正實例化一個Airplane
    virtual int maxLoad() const = 0;
  • 為您的Airplane class 添加 3 個子類,每種類型的飛機一個。 這些子類將定義容器的最大數量,例如,使用static inline const成員。
    static inline const int maxContainers{10};

他們還將實現maxLoad虛擬方法以返回maxContainers

    virtual int maxLoad() const override { return maxContainers; }
  • 對於每家航空公司,將airplaneList保留為Airplane*的數組,然后為每個指針分配一個特定的飛機實例:
    airplaneList = new Airplane*[nAirplanes];
    int size = 0;
    for (int i = 0; i < nA321; i++, size++) { airplaneList[size] = new A321(); }
    for (int i = 0; i < nB777; i++, size++) { airplaneList[size] = new B777(); }
    for (int i = 0; i < nB787; i++, size++) { airplaneList[size] = new B787(); }
  • 關於析構函數的兩個要點:
  1. 使Airplane析構函數虛擬化。
    由於airplaneList是通過new創建的Airplane指針數組,在某些時候我們應該delete每個指針,這將調用Airplane析構函數; 然而,由於我們實際上創建了Airplane子類的實例(例如使用new A321() ),我們需要執行子類的析構函數。
    如果Airplane析構函數不是虛擬的,那將是不可能的。
    virtual ~Airplane() {};
  1. Airline constructor 正在為飛機列表做一個new new[] ,並為每架飛機做一個 new。 Airline析構函數應該執行相應的delete[]delete
Airline::~Airline()
{
    for (int i = 0; i < nAirplanes; i++) { delete airplaneList[i]; }
    delete[] airplaneList;
}

[演示]

// Outputs:
//
//   Airplane 1 (A321): maximum load = 10
//   Airplane 2 (A321): maximum load = 10
//   Airplane 3 (A321): maximum load = 10
//   Airplane 4 (A321): maximum load = 10
//   Airplane 5 (B777): maximum load = 32
//   Airplane 6 (B777): maximum load = 32
//   Airplane 7 (B787): maximum load = 40
//   Assignment complete

附帶說明一下,使用std::vector作為airplaneList和指向飛機實例的智能指針(例如std::unique_ptr )會大大簡化代碼:

  • 您不需要飛機列表的堆分配。
  • 您不需要關心刪除飛機和飛機列表的堆實例。

[演示]

class Airline
{
public:
    Airline(int nA321, int nB777, int nB787);
    ~Airline() {}
    void addShipment(int size);
    void printSummary(void) const; // prints a list of airplanes with their current and maximum load.

private:
    int nAirplanes{}; // total # of airplanes used by airline
    std::vector<std::unique_ptr<Airplane>> airplaneList{}; // array of pointers to Airplane objects
};
  
Airline::Airline(int nA321, int nB777, int nB787)
: nAirplanes(nA321 + nB777 + nB787)
{
    for (auto i = 0; i < nA321; i++) { airplaneList.emplace_back(std::make_unique<A321>()); }
    for (auto i = 0; i < nB777; i++) { airplaneList.emplace_back(std::make_unique<B777>()); }
    for (auto i = 0; i < nB787; i++) { airplaneList.emplace_back(std::make_unique<B787>()); }

    for (size_t i = 0; i < airplaneList.size(); i++)
    {
        std::cout
            << "Airplane " << i+1
            << " (" << airplaneList[i]->getName() << ")"
            << ": maximum load = " << airplaneList[i]->maxLoad() << "\n";
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM