沒有太多的細節到apple
,並假設他們有一個默認的構造函數,這是一個天真的方式。
class Fruits {
public:
typedef std::vector<apple> AppleArray;
typedef AppleArray::iterator AppleIterator;
typedef AppleArray::const_iterator AppleConstIterator;
Fruits(int appleCount)
: mApples(appleCount)
{
}
~Fruits()
{
}
apple& getAppleAt(size_t index)
{
return mApples.at(index);
}
const apple& getAppleAt(size_t index) const
{
return mApples.at(index);
}
AppleIterator getAppleBegin()
{
return mApples.begin();
}
AppleIterator getAppleEnd()
{
return mApples.end();
}
AppleConstIterator getAppleBegin() const
{
return mApples.begin();
}
AppleConstIterator getAppleEnd() const
{
return mApples.end();
}
size_t getAppleCount() const
{
return mApples.size();
}
private:
std::vector<apple> mApples;
};
我假設這是沒有生產代碼,它是純粹的學習C++。如果您要在現實生活中設計類似的東西,您需要考慮Apple
是Fruit
而Fruits
更像是一個或多個水果,其中一個是Apple
。在這種情況下,您的Fruits
會更像std::vector<Fruit*> fruits;
,然後使用循環初始化fruits
列表中您想要的Apple
的數量。
唉!老實說,他們都是不好的建議。 'std :: vector'沒有虛擬析構函數,所以從'std :: vector'繼承是一個壞主意。如果'蘋果'不能在課堂以外進行操作,請封裝它,不要暴露它! –
謝謝你的回答,但我不確定它是如何工作的。例如,當我們甚至沒有定義C時,它是什麼意思C(大小)?不太熟悉繼承 – Cancan
@Cancan:我們已經將'C'定義爲一個類成員,因此初始化列表中的'C(size)'意味着「通過將'size'作爲參數傳遞給它的構造函數來初始化'C'」。這裏不要擔心遺傳;正如Vite所說,從標準容器繼承是一個壞主意。 –