std :: vector与非成员函数的类(以及typedef)

时间:2015-08-17 13:56:58

标签: c++ class oop vector

我的项目存在以下设计难题:
我有一个I类的对象设计存储在std::vector中。 我想为这种向量添加一些方法(std::vector<MyClass>)。 我想将这个向量封装在另一个类中并添加我需要的这些方法,当然还提供了我使用的std::vector的所有功能。这是一个明智的想法吗?或者我应该只使用非成员函数,也许我自己方便使用typedef

3 个答案:

答案 0 :(得分:1)

只有当你的类型真的是一个向量时才应该使用typedef。 typedef使您无法控制自己的类型行为以及使用它可以执行的操作。

如果没有,如果你想要一个适当的长寿命设计,那么你应该隐藏实现细节:

  • 如果明天你使用另一个标准容器如列表或地图怎么办?
  • 如果您的需求发展并且您需要一些非标准结构(如concurrent_vectors甚至数据库),该怎么办?
  • 如果在插入或其他vetor操作时,您决定做一些额外的步骤。

两种方式:

  • 有一个向量成员并只发布你真正需要的方法(根据组成而不是继承的原则)
  • 继承标准向量,但同样,只有你的类型代表一个向量结构,并且如果你知道这些限制(例如没有虚拟析构函数等)及其后果。

答案 1 :(得分:1)

如果我理解正确,你想拥有一个自定义容器,它提供std :: vector成员函数和特定于该容器的自定义函数吗?

IMO,在您的情况下最适合的方式是创建自己的类型并封装您的向量:

class MyClass{};

class MyContainer {
  using size_type = std::vector<MyClass>::size_type;
public:
  MyContainer() = default;
  MyContainer(std::vector<MyClass> const& vec) : vec_(vec) {}
  size_type size() const noexcept;
  // other functions you want

private:
  std::vector<MyClass> vec_;
};

其他“坏”选项是:

  • 创建非成员函数,但不适合OOP设计
  • 继承自std :: vector,但STL类不是为其设计的 继承

希望它会对你有所帮助。

答案 2 :(得分:1)

在这种情况下,非成员函数是正确的。请参阅Scott Meyer关于How Non-Member Functions Improve Encapsulation主题的文章。

此外,请使用typedef std::vector<MyClass> someTypeName;您不希望std::vector<MyClass>遍布整个代码。您想要 类型的内容而不是它的实现方式。如果你必须改变实现以使用不同的容器,你会很高兴你使用了typedef。

评论中的

ETA:我提醒using及其对typedef的优越性。

using someTypeName = std::vector<MyClass>;