[英]Understanding an array of pointers to an object in c++
有3種類型的飛機。
我想對列表進行索引並創建一個 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(); }
Airplane
析構函數虛擬化。airplaneList
是通過new
創建的Airplane
指針數組,在某些時候我們應該delete
每個指針,這將調用Airplane
析構函數; 然而,由於我們實際上創建了Airplane
子類的實例(例如使用new A321()
),我們需要執行子類的析構函數。Airplane
析構函數不是虛擬的,那將是不可能的。 virtual ~Airplane() {};
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.