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

Den*_*hie 0 c++ objective-c

Cheese上课了.在我的程序中,我经常收集奶酪,主要是vector<Cheese>对象.

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

vector<Cheese> cheeses;
//cheeses = ...
cheeses.eat();
Run Code Online (Sandbox Code Playgroud)

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

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

Kon*_*lph 6

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

void eat(std::vector<Cheese> const& cheeses) {
    // …
}
Run Code Online (Sandbox Code Playgroud)

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

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


Jer*_*fin 6

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

std::for_each(cheeses.begin(), cheeses.end(), eat).
Run Code Online (Sandbox Code Playgroud)

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

  • @DennisRitchie:C++有很多算法可以作为一个整体来处理集合,而且它们的功能非常多样化. (2认同)