我有一个Cheese
课程。在我的程序中,我经常收集奶酪,主要是vector<Cheese>
个对象。
我希望能够eat()
一个奶酪系列,就像这样:
vector<Cheese> cheeses;
//cheeses = ...
cheeses.eat();
怎么做?如何向vector<Cheese>
类添加新成员函数?我应该只是继承vector<Cheese>
类,命名子类CheeseCollection
并在那里添加成员函数,还是有更好的方法?
来自Objective-C,我习惯于使用类别,这允许我向类添加函数(“方法”)。有类似的东西在C ++中可用,还是在C ++中像疯了似的子类被认为更自然?
答案 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
};