我是一個素食主義者,所以假設我們有蔬菜:在C++中定義許多組合對象的最佳方法?
class Vegetable {}; // base class for vegetables
class Tomato : public Vegetable {};
class Potato : public Vegetable {};
class Carrot : public Vegetable {};
class Broccoli : public Vegetable {};
並假設我們想要做的飯菜與他們:
class Meal {}; // base class for meals
class Soup : public Meal {
...
Soup(Vegetable *veg1, Vegetable *veg2) : veg1(veg1), veg2(veg2) {};
};
class Salad : public Meal {
...
Salad(Vegetable *veg1, Vegetable *veg2, Vegetable *veg3) : veg1(veg1), veg2(veg2), veg3(veg3) {};
};
class VeggieBurger : public Meal {
...
VeggieBurger(Vegetable *veg) : veg(veg) {};
};
現在我們想定義不同的蔬菜不同的組合餐在食譜:
std::vector<Meal *> cookbook;
cookbook.push_back(new Soup(new Tomato, new Potato));
cookbook.push_back(new Soup(new Potato, new Broccoli));
cookbook.push_back(new Salad(new Tomato, new Carrot, new Broccoli));
cookbook.push_back(new Salad(new Tomato, new Potato, new Tomato));
cookbook.push_back(new Salad(new Broccoli, new Potato, new Carrot));
cookbook.push_back(new VeggieBurger(new Potato));
// many more meals...
因此,我們正在創造越來越通過constructo共同組成堆上許多小物件r參數並在運行時推送到std :: vector。顯然,這種設計的缺點是,我們必須自己管理記憶,並在我們的膳食析構器中刪除Vegetable對象,並在超出範圍時刪除我們的食譜膳食。
因此,一個可能的設計選擇是使用智能指針來爲我們的膳食和蔬菜做記憶管理的負擔。
但我想知道是否有可能在編譯時編寫食譜,也許有某種模板魔法?食譜不一定是std :: vector,但我們仍然可以遍歷它,獲取Meal對象並在構成餐上調用成員函數。有沒有更好的方法來做到這一點?
當然,番茄是一種水果。 :-P另外,請看[Boost.Fusion](http://www.boost.org/libs/fusion/)的'boost :: fusion :: vector <>'。 – ildjarn 2012-01-05 00:26:28
您可能已經走上了一條糟糕的設計道路。你的例子是否準確,你想定義許多類,全部是空的?並且你想分配相同空類的許多實例,例如'Tomato'? – 2012-01-05 00:29:43
在現實世界中,一個'Vegetable'具有狀態和成員函數。 – 2012-01-05 00:43:28