用另一个类的向量生成类向量的函数声明

时间:2014-06-14 19:23:28

标签: c++ function vector class-design

我有2个班级:

class Item;
class Component;

我有一个函数可以从vector Item生成vector Component

static vector<Item> generateItemsFromComponents( vector<Component> components )
{
    vector<Item> vi;
    // ...
    return vi;
}

我的问题是,我在哪里声明这个功能?在Item班级或Component班级?或者班级设计错了?也许建议更好的方法来实现这个目标?

1 个答案:

答案 0 :(得分:1)

首先,如果从ComponentItem的转换功能是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(); }

最后一种方法的优点:

  1. 您不依赖于容器类型:您使用迭代器,comp可以是任何符合标准的容器,而不仅仅是vector
  2. 它可能更有效率,而且绝对可读

  3. <强>答案:

    • 在Component类
    • 中提供单个转换函数
    • 将标准<algorithm>与此功能一起使用
    • 将lambdas视为非常简单函数的替代
    • 如果某个功能与某个类型无关,只需将其设为免费功能
    • 即可