0

我有一Cheese堂课。在我的程序中,我处理了很多奶酪的收集,主要是vector<Cheese>对象。

我希望能够eat()收集奶酪,如下所示:

vector<Cheese> cheeses;
//cheeses = ...
cheeses.eat();

这个怎么做?如何向vector<Cheese>类添加新的成员函数?我应该只是子类化vector<Cheese>类,命名子类CheeseCollection并在那里添加成员函数,还是有更好的方法?

来自 Objective-C,我习惯了类别,这允许我向类添加函数(“方法”)。类似的东西在 C++ 中可用,还是在 C++ 中疯狂地进行子类化被认为更自然?

4

3 回答 3

6

在 C++ 中,您根本不会为此使用成员函数——使用自由函数:

void eat(std::vector<Cheese> const& cheeses) {
    // …
}

这与那些 Obj-C 类别非常相似,即使语法不同(并且您没有使用成员访问)。

标准库容器类并未设计为可子类化,因此该方法将失败。你可以做的是使用组合而不是继承——即有一个CheeseCollection包含奶酪向量作为成员的类。这可能有一些优势,具体取决于您的整体设计。但是,总的来说,以上是最 C++ 的解决方案。

于 2012-12-02T19:47:42.507 回答
6

两者都不是——你想要的是一个算法。假设您eat已经知道如何吃一个 Cheese 对象,将其应用于整个集合将类似于:

std::for_each(cheeses.begin(), cheeses.end(), eat).

与其他一些语言不同,C++ 不会盲目地坚持面向对象,即使它没有真正意义。

于 2012-12-02T19:51:10.190 回答
3

您可以做的一件事是定义您自己的使用(封装)向量的类:

class Cheeses
{
  vector<Cheese> v;
public:
  void eat()
  {
    v.erase();
  }

  // plus other methods which delegate to the contained vector
};
于 2012-12-02T19:51:38.007 回答