我有2个班级:
class Item;
class Component;
我有一个函数可以从vector
Item
生成vector
Component
个
static vector<Item> generateItemsFromComponents( vector<Component> components )
{
vector<Item> vi;
// ...
return vi;
}
我的问题是,我在哪里声明这个功能?在Item
班级或Component
班级?或者班级设计错了?也许建议更好的方法来实现这个目标?
答案 0 :(得分:1)
首先,如果从Component
到Item
的转换功能是1对1,您应该考虑:
Component
中使用明确的转换方法,例如Item ToItem();
或例如:
operator const Item&() const;
一旦你有了单个转换函数,对容器进行操作的方法实际上并不属于你现有的任何接口(除非你已经有了一个容器组件的类),所以声明一个自由函数是有意义的:
示例:强>
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
。<强>答案:强>
<algorithm>
与此功能一起使用