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

时间:2012-12-02 19:46:21

标签: c++ objective-c

我有一个Cheese课程。在我的程序中,我经常收集奶酪,主要是vector<Cheese>个对象。

我希望能够eat()一个奶酪系列,就像这样:

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

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

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

3 个答案:

答案 0 :(得分:6)

在C ++中,你根本就不会使用成员函数 - 使用自由函数:

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

即使语法不同(并且您没有使用成员访问权限),这也与Obj-C类别相当。

标准库容器类未设计为可子类化,因此方法将失败。你可以做的是使用组合而不是继承 - 即有一个CheeseCollection类,其中包含一个奶酪矢量作为成员。根据您的整体设计,这可能有一些优势。但是,一般来说,上面是最多的C ++ ic解决方案。

答案 1 :(得分:6)

两者都没有 - 你想要的是一种算法。假设你已经知道如何吃一个Cheese对象eat,将它应用于整个集合将是这样的:

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

与其他一些语言不同,C ++并没有保持对面向对象的盲目遵守,即使它没有真正意义。

答案 2 :(得分:3)

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

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

  // plus other methods which delegate to the contained vector
};