gpt4 book ai didi

c++ - 在 C++ 中定义多个组合对象的最佳方式?

转载 作者:太空宇宙 更新时间:2023-11-04 12:13:34 26 4
gpt4 key购买 nike

我是素食主义者,所以假设我们有蔬菜:

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...

因此我们在堆上创建了许多小对象,这些对象通过构造函数参数组合在一起并在运行时推送到 std::vector 上。显然,这种设计的缺点是,我们必须自己管理内存并删除膳食析构函数中的 Vegetable 对象,并在超出范围时删除某处的食谱膳食。

因此,一个可能的设计选择是使用智能指针来分担为我们的膳食和蔬菜进行内存管理的负担。

但我想知道是否可以在编译时编写食谱,也许使用某种模板魔术?食谱不一定必须是 std::vector,但我们仍然希望能够对其进行迭代,获取 Meal 对象并在组合餐点上调用成员函数。有更好的方法吗?

最佳答案

我发现代码生成对我来说正成为一种非常有用的工具。也许编写一个简短的程序,甚至可能只是一个脚本,然后将为您生成样板代码。

任何时候你添加到你的食谱,你运行程序/脚本,这将生成每顿饭的标题和标题,甚至可能是食谱本身的一些来源。

与您这一代人相处的深度取决于您。你可以只编辑代码生成器的源代码来添加新的食物,你可以做一些简单的基于文本的解析,或者,如果真的值得花时间和精力去维护,把你的代码生成器变成一个编辑器(代码生成作为它的输出) .

至少有一个众所周知的 AAA 游戏引擎实际上为任何标记为与 native 代码交互的脚本生成 C++ 头文件。从那里开始,源文件中的宏实现样板方法。其余方法由开发人员实现。

更新:C++11 实际上支持 variadic template arguments .我没有任何使用 C++11 的经验,所以我不确定可变参数模板参数是否支持我们正在研究的内容。

关于c++ - 在 C++ 中定义多个组合对象的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8736046/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com