std::vector 类与非成员函数(连同 typedef)[关闭]

Posted

技术标签:

【中文标题】std::vector 类与非成员函数(连同 typedef)[关闭]【英文标题】:Class of std::vector vs non-member functions (along with a typedef) [closed] 【发布时间】:2015-08-17 13:56:58 【问题描述】:

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

【问题讨论】:

为什么不写非成员函数? 谁在乎?面向对象应该让生活更轻松,而不是更复杂。 在 C++ 中,与 X 类关联并以 X 为参数的命名空间中的非成员函数通常被认为是类 X 的公共接口的一部分(感谢ADL)。对于面向对象的设计来说,使用. 并不是必须的。 而且设计不一定是面向对象的。 @ZachiShtain 我了解typedef 的用法 - 但我不知道它会以何种方式帮助扩展其界面? 【参考方案1】:

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

另外,请务必使用typedef std::vector<MyClass> someTypeName; 您不希望std::vector<MyClass> 在您的代码中乱扔垃圾。你想要的是什么类型 而不是它是如何实现的。如果您必须更改实现以使用不同的容器,您会很高兴您使用了 typedef。

ETA: 在 cmets 中,我想起了 using 及其优于 typedef

using someTypeName = std::vector<MyClass>; 

【讨论】:

请不要使用typedef,而是使用using @vladon,你能举例说明如何使用using 而不是typedef吗? @ZachiShtain using MySuperType = std::vector&lt;MyClass&gt;; @vladon,不要只是告诉我们不要这样做;请解释原因(解释的链接很好)。由于它相当新,我忘记了使用它的优点。应该首选使用。 @RobK using 可以模板化,而typedef 不能。除此之外,没有任何优势。就我而言,我更喜欢using,因为它的可读性更好(using NewType = Some_old_typetypedef Some_old_type NewType; 好)。【参考方案2】:

只有当你的类型确实是一个向量时,你才应该使用 typedef。 typedef 使您几乎无法控制自己的类型的行为方式以及可以用它做什么。

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

如果明天您使用另一个标准容器,如列表或地图,该怎么办? 如果您的需求发生变化并且需要一些非标准结构,例如 concurrent_vectors 甚至数据库,该怎么办? 如果在插入或其他矢量操作时,您决定执行一些额外的步骤。

两种方法:

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

【讨论】:

【参考方案3】:

如果我对您的理解正确,您想要一个自定义容器,该容器同时提供 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 类不是为 继承

希望对你有帮助。

【讨论】:

相反,Scott Myers 提出了一个很好的案例,non-member functions improve encapsulation。

以上是关于std::vector 类与非成员函数(连同 typedef)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

静态类与非静态类静态成员的区别

C++中类与函数的模板类型推导?

如何访问 std::vector 类型的成员

C++ 非静态成员函数的非法调用

MSVC 2015 为 std::vector 选择不正确的构造函数重载

具有成员 std::vector 的移动语义