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

C++ std::vector与非成员函数的类(以及typedef),c++,class,oop,vector,C++,Class,Oop,Vector,我在项目中遇到了以下设计难题: 我设计的类的对象存储在std::vector中。 我想为这种向量添加一些方法(std::vector)。 我正在考虑将这个向量封装在另一个类中,并添加我需要的这些方法,当然还提供了我使用的std::vector的所有功能。这是一个明智的想法吗?或者我应该只使用非成员函数,或者为了方便起见使用typedef 只有当您的类型实际上是一个向量时,才应该使用typedef。typedef对您自己的类型的行为以及您可以使用它做什么几乎没有控制权 如果不是,并且您想要一个合适

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

只有当您的类型实际上是一个向量时,才应该使用typedef。typedef对您自己的类型的行为以及您可以使用它做什么几乎没有控制权

如果不是,并且您想要一个合适的长寿设计,那么您应该隐藏实现细节:

  • 如果明天您使用另一个标准容器,如列表或地图,该怎么办
  • 如果您的需求不断发展,您需要一些非标准结构,比如并发向量,甚至数据库,该怎么办
  • 如果在插入或其他vetor操作时,您决定执行一些附加步骤,该怎么办
有两种方法:

  • 拥有一个vector成员并只发布您真正需要的方法(根据组合而不是继承的原则)
  • 从标准向量继承,但同样,仅当您的类型表示向量结构,并且您知道限制(例如缺少虚拟析构函数等)及其后果时

如果我理解正确,您希望有一个自定义容器,它同时提供std::vector成员函数和特定于该容器的自定义函数

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

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_;
};
classmyclass{};
类霉菌容器{
使用size\u type=std::vector::size\u type;
公众:
MyContainer()=默认值;
MyContainer(std::vector const&vec):vec(vec{}
size_type size()常量noexcept;
//您需要的其他功能
私人:
std::向量向量向量;
};
其他“坏”选项包括:

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

希望它能帮助您。

在这种情况下,非成员函数是正确的。参见Scott Meyer关于该主题的文章

另外,请务必使用
typedef std::vector someTypeName您不希望代码中到处都是
std::vector
。您想要的是什么类型,而不是它的实现方式。如果您必须更改实现以使用不同的容器,您将非常高兴使用了typedef

ETA:在评论中,我想起了
使用
及其相对于
typedef
的优势

using someTypeName = std::vector<MyClass>; 
使用someTypeName=std::vector;

为什么不编写非成员函数?谁在乎呢?面向对象应该使生活更简单,而不是更复杂。在C++中,与类<代码> x<代码>相关联的命名空间中的非成员函数,并以 x>代码>作为参数,通常被认为是类<代码> x的公共接口的一部分(由于ADL)。使用
对于面向对象的设计来说并不是必需的。设计也不一定要面向对象才能好。@ZachiShtain我理解
类型定义的用法-
-但我不知道它在扩展接口方面有什么帮助?相反,斯科特·迈尔斯提出了一个很好的例子。请不要使用
typedef
,而是使用
using
。@vladon,你能举个例子说明如何使用
using
而不是
typedef
?@ZachiShtain
using MySuperType=std::vector@vladon,不要告诉我们不要这样做;请解释原因(链接到解释即可)。因为它是相当新的,我忘记了使用它和它的优点。应首选使用。@RobK
使用
可以模板化,而
类型定义
不能。除此之外,没有任何优势。就我而言,我更喜欢
使用
,因为它的可读性更好(
使用NewType=Some\u old\u type
typedef Some\u old\u type NewType;
)。