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<MyClass>;
@vladon,不要只是告诉我们不要这样做;请解释原因(解释的链接很好)。由于它相当新,我忘记了使用它的优点。应该首选使用。
@RobK using
可以模板化,而typedef
不能。除此之外,没有任何优势。就我而言,我更喜欢using
,因为它的可读性更好(using NewType = Some_old_type
比typedef 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)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章