C++设计:子类,还是有更好的方法
C++ design: subclass, or are there better ways?
我有一个Cheese
类。在我的程序中,我处理了很多奶酪的收集,主要是vector<Cheese>
物品。
我希望能够eat()
奶酪系列,如下所示:
vector<Cheese> cheeses;
//cheeses = ...
cheeses.eat();
怎么做?如何将新的成员函数添加到vector<Cheese>
类?我应该只对vector<Cheese>
类进行子类化,将子类命名为CheeseCollection
并在那里添加成员函数,还是有更好的方法?
来自Objective-C,我习惯于类别,这允许我向类添加函数("方法")。C++中是否有类似的东西,还是在C++中疯狂地进行子类化更自然?
在C++中,您根本不会为此使用成员函数 – 使用自由函数:
void eat(std::vector<Cheese> const& cheeses) {
// …
}
这与那些 Obj-C 类别非常等效,即使语法不同(并且您没有使用成员访问)。
标准库容器类未设计为可子类化,因此该方法将失败。你可以做的是使用组合而不是继承 - 即有一个包含奶酪向量作为成员的CheeseCollection
类。这可能有一些优点,具体取决于您的整体设计。但是,一般来说,以上是最C++的解决方案。
两者都不是 - 你想要的是一个算法。假设您有一个已经知道如何吃一个 Cheese 对象的eat
,将其应用于整个集合将是这样的:
std::for_each(cheeses.begin(), cheeses.end(), eat).
与其他一些语言不同,C++ 不会保持对面向对象的奴性坚持,即使它没有真正的意义。
你可以做的一件事是定义你自己的类,它使用(封装)向量:
class Cheeses
{
vector<Cheese> v;
public:
void eat()
{
v.erase();
}
// plus other methods which delegate to the contained vector
};
相关文章:
- 初始化具有非默认构造函数的std::数组项的更好方法
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 编写按初始值循环的循环的更好方法是什么
- 用 c++ 为游戏制作"bullet"的更好方法?
- 在CMakeLists中包含目录的更好方法.txt
- 将QDomDocument数据用作文本的更好方法
- C++ - 创建具有相同字符的特定大小的以 null 结尾的 c 样式字符串的更好方法
- 在 sqlite3 中批量插入的更好方法C++
- 设计许多单例代码结构的更好方法
- 使用继承的类模板避免公共成员不可见和源代码膨胀/重复的更好方法
- 在初始化列表中初始化数组的更好方法
- 将对象从一个 std::d eque 移动到另一个的更好方法
- 请告诉我在巴泽尔拥有多平台工作空间的更好方法
- 构造具有大量数据的对象的更好方法(C++)
- 从2D矢量中找出最小尺寸的向量元素的更好方法
- 在C++中创建不可变对象的更好方法
- 在构造函数中组织初始值设定项列表的更好方法
- std::copy with return values - 防止"expression: string iterators incompatible"的更好方法?
- 删除数组成员的更好方法是什么?
- 在C 中操作数据的更好方法是什么