C++设计:子类,还是有更好的方法

C++ design: subclass, or are there better ways?

本文关键字:更好 方法 设计 子类 C++      更新时间:2023-10-16

我有一个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
};