如何获取c ++类成员向量的大小?

时间:2014-08-05 15:50:31

标签: c++ vector

我有一个类std::vector成员的类。在某些地方,我需要另一个类中该向量的大小。因为该成员是私有的,所以我创建了一个getter来返回它。在审核代码时,我脑子里出现了一个问题:最好是调用getter然后调用它size(),还是创建一个" size getter"代替吗

这是我的班级:

class MyClass
{
private:
  std::vector< int > m_myVec;

public:
  std::vector< int > getMyVec() const { return m_myVec; }
  // Shall I create:
  // std::size_t getMyVecSize() const { return m_myVec.size(); }

  // ... other function
};

在我的代码的其他部分:

std::size_t sz = myClsObj.getMyVec().size(); // or
if (myClsObj.getMyVec().size() > 5) { /*...*/ }

这样做是一种好习惯,还是我会创建并调用“#get; size getter&#34;代替?


我需要向量(在代码的其他部分我称之为getter)及其大小;所以没有必要选择保留其中一个吸气剂。

另一个事实是我使用的是C ++ 11,所以不需要返回const引用。

基于C ++ 11:如果我调用myClsObj.getMyVec().size(),那么返回向量但是它的大小是否太聪明了?

3 个答案:

答案 0 :(得分:15)

您可以参考Tell Don't Ask原则。这里可能有点令人困惑,因为这两个版本在技术上都是&#34;要求&#34;为了某件事。但重点不是要使用getter来检索类的实现细节,然后对它执行一些操作,而是要告诉类来完成所需的工作,在这种情况下 - 检索大小

这也与Law of Demeter有关。返回整个矢量的方法在这个链接中以一种很棒的方式可视化,具有以下故事:

  

[...]“这将是1.95美元。”此时,我自然地脱掉了裤子,这家伙开始尖叫我警察和不雅曝光。困惑,我说,“看,我只是想付钱给你 - 我会把你的裤子递给你,然后你在我的口袋里翻找你的钱包,直到你找到我的钱包,你会把它取出去寻找现金

&#34;尺寸吸气剂&#34;方法涉及一种更自然的方式,让你的钱包自己从裤子里拿出来支付: - )

它也直接来自OOP - Encapsulation中最基本的概念之一。简而言之,它的意思是隐藏(封装)来自外部世界的类实现的更多细节。较少的耦合将在未来为您提供更大的灵活性。如果这听起来过于抽象或模糊,请不要担心。每个程序员(即我见过的几乎所有程序员,包括我)最终都达到了一个目的,当每个所谓的简单改变时,必须在远程代码中进行大量修复。在你的手指下报复耦合让你回想起这条规则,并永远记住它;)

最后,通常你不会创建代表包装的向量或类似东西的类。 vector 只是一个技术性问题。通常,这样的类表示一些特定元素的集合,这些元素在 Domain 逻辑的级别上具有名称。所以大多数时候它不是.getTheSizeOfMyInnerVector而是.getRecordCount.getNumberOfStudents等等。此类课程的客户甚至不需要知道有{{{} 1}}里面。只要该类处理维护某事集合的任务,它就无所谓了。例如,在这种情况下,上述灵活性可以表示您可以切换到不同的容器,而无需担心您班级的客户。并且不需要在代码中使用这个类的数千个地方翻阅。

答案 1 :(得分:10)

制作一个&#34;尺寸的吸气剂&#34;并返回m_myVec.size()的值,除非您确实需要完全访问该向量。 size getter会将更少的代码暴露给外部世界。如果您只是想提供一种获取向量的方法,那么它根本就不是私有的。

答案 2 :(得分:5)

首先,正如评论者指出的那样,如果你对向量使用了一个getter,那么让它返回一个const引用而不是一个副本。

回答你的问题:这取决于你想要的数据封装级别。如果向量本身是类的实现细节,并且您不希望类的用户能够更改其内容(或者只能通过类合同中明确定义的操作),那么您不应该有一个getter(a)参考)矢量。