c++ - 如何获取 C++ 类成员 vector 的大小?

标签 c++ vector

我有一个类,它有一个类型为 std::vector 的成员。在某些地方,我需要另一个类中该 vector 的大小。因为成员是私有(private)的,所以我创建了一个 getter 来返回它。在查看代码时,我想到了一个问题:是调用 getter 然后调用 size() 还是创建一个“size getter”更好?

这是我的类(class):

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) { /*...*/ }

这样做是个好习惯,还是我应该创建并调用“size getter”?


我需要 vector (在代码的其他部分我称之为 getter)和它的大小;所以选择只保留一个 getter 是没有意义的。

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

基于 C++11:如果我调用 myClsObj.getMyVec().size() 不返回 vector 而是返回它的大小是不是很聪明?

最佳答案

可以引用Tell Don't Ask原则。这里可能有点困惑,因为这两个版本在技术上都在“要求”某些东西。但重点不是使用 getter 来检索类的实现细节然后对其执行一些操作,而是告诉类完成所需的工作,在本例中是检索大小.

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

[...] “that’ll be $1.95.” At this point, naturally, I removed my pants and the guy started screaming at me about police and indecent exposure. Confused, I said, “look, I’m just trying to pay you — I’ll hand you my pants and you go rummaging around in my pockets until you find my wallet, which you’ll take out and go looking through for cash.

“size getter”方法涉及一种更自然的方式,即自己从裤子中取出钱包并付款:-)

它也直接来自OOP中最基本的概念之一。 - Encapsulation .简而言之,它的目的是向外界隐藏(封装)类实现的尽可能多的细节。更少的耦合给你 future 更多的灵 active 。如果这听起来太抽象或模糊,请不要担心。每个程序员(即我遇到的几乎每个程序员,包括我在内)最终都会遇到一个问题,当每个看似简单的更改之后,都必须在代码的遥远部分进行大量修复。将耦合的报复降在你的手指下,让你想起这条规则,并永远记住它;)

最后,通常您不会创建表示包装的 vector 或类似东西的类。 vector 只是一个技术问题。通常这样的类代表一些特定元素的集合,这些元素在您的逻辑级别上具有名称。所以大多数时候它不是 .getTheSizeOfMyInnerVector 而是 .getRecordCount.getNumberOfStudents 等。此类的客户甚至不需要知道里面有一个std::vector。没关系,只要该类处理维护某物 集合的任务即可。例如,在这种情况下,上述灵 active 可能意味着您可以切换到不同的容器,而不必担心您类(class)的客户。而且无需翻阅代码中使用此类的数千个地方。

关于c++ - 如何获取 C++ 类成员 vector 的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25143123/

相关文章:

c++ - 运算符<<在单例中的重新定义

loops - SPSS 中循环变量重新编码的语法

C++:检查 vector<Class> 是否是 vector<Class> 的子集

c++ - 如何使用互斥体保护 vector ?

c++ - gdb 调用函数 - 如何使用 std::cout 作为参数?

c++ - 为什么 std::string_view 没有 assign() 和 clear() 方法?

c++ - 从ubuntu上的utc时间计算unix时间

c++ - 运算符重载非成员函数?

c++ - 如何做一个 vector<class objects*> 深拷贝

r - 如何在 R 中进行集合乘法(笛卡尔积)