我有 2 个类:
class Item;
class Component;
我有一个函数可以从 Component
的 vector
生成 Item
的 vector
static vector<Item> generateItemsFromComponents( vector<Component> components )
{
vector<Item> vi;
// ...
return vi;
}
我的问题是,我在哪里声明这个函数?在 Item
类中还是在 Component
类中?还是类(class)设计有误?也许建议更好的方法来实现这一目标?
最佳答案
首先,如果一个Component
有一个1对1的转换函数到Item
,你应该考虑:
- 在
Component
中有一个明确的转换方法,例如Item ToItem();
, 或 - 有一个隐式转换运算符,但这不太可能除非自动转换(由编译器)在任何情况下都有意义。
例如:
operator const Item&() const;
一旦你有了可用的单一转换函数,在容器上操作的方法实际上并不属于你现有的任何接口(interface)(除非你已经有一个用于组件容器的类),所以声明一个自由函数是有意义的:
示例:
vector<Item> generateItemsFromComponents( const vector<Component>& components )
{
vector<Item> vi;
for(auto& comp in components)
vi.push_back(comp.ToItem());
return vi;
}
但是,正如@chris 所指出的,使用 std::transform
直接与 lambda 一起使事情变得更容易:
示例:
vector<Item> vi;
transform(begin(comp), end(comp), back_inserter(vi), [](Component c){ return c.ToItem(); }
最后一种方法的优点:
- 您不依赖于容器类型:您对迭代器进行操作,
comp
可以是任何符合标准的容器,而不仅仅是vector
. - 它可能更高效,而且绝对可读性强
回答:
- 在Component类中提供单一的转换函数
- 使用标准
<algorithm>
连同这个功能 - 考虑用 lambda 代替非常简单的函数
- 如果一个函数与类型无关,就让它成为一个自由函数
关于c++ - 用另一个类的 vector 生成类的 vector 的函数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24223459/