【问题标题】:Returning a private vector返回一个私有向量
【发布时间】:2014-11-19 19:29:08
【问题描述】:

我有一个带有私有属性的类,它是一个向量。执行 getter 函数的最佳方法是什么?

  1. 返回整个向量:vector<char*> getNames() { return names; }
    • 这会返回一个副本还是一个指针?由于它是私有的,因此可以访问吗?
  2. 返回迭代器:vector<char*>::iterator getNames() { return names.begin(); }
  3. 公开矢量
    • 我知道这对于 OOP 来说是不好的做法,只列出选项。

【问题讨论】:

  • 请注意,选项 2 可以工作,但前提是您也提供了访问 end() 迭代器的方法,否则消费者将不知道何时停止迭代——您可能想要请改用vector<char*>::const_iterator,这样消费者就不能修改元素。在那张纸条上,你为什么不使用std::vector<std::string>
  • @cdhowie 即使const_iterator(或返回一个常量引用)也只能防止指针本身被修改,而不是它们指向的字符串。
  • @T.C.确实,投票最多的答案仍然是这种情况。字符串向量确实是最好的方法,因为 const std::string 不能像 char * const 那样修改。
  • @cdhowie 我正在更新一些旧代码,所以我在弄乱字符串之前更改了向量。不过感谢您的建议。
  • 调用者是否需要整个vectorconst char* getName(unsigned i) const; 就够了吗?更容易维护 const 的正确性和封装性。

标签: c++ oop vector iterator private


【解决方案1】:

const vector<char*>& 返回。它确保它不会被外部修改,也不会复制。

【讨论】:

  • 所以应该是const vector<char*>& getNames() {return names;}?
  • @Sorescale 您可能也应该创建函数const,例如const vector<char*>& getNames() const { ... }
  • 这并不妨碍人们自己修改名称。 getNames()[0][0] = '\0';
  • @T.C 嗯,这是真的,但我认为没有将 char* 更改为其他内容的好方法。
【解决方案2】:

如果您实际上在内部使用vector<char *>,确保用户不会修改名称(没有丑陋且明显的const_cast)的唯一方法是按值返回vector<const char *>

vector<const char *> getNames() const { return {names.begin(), names.end()}; }

或者,C++11 之前的版本:

vector<const char *> getNames() const { return vector<const char *>(names.begin(), names.end()); }

通过值或 const 引用返回 vector&lt;char *&gt;,将阻止用户修改向量本身,但不能修改它指向的字符串的内容。

最好使用vector&lt;std::string&gt;,在这种情况下,您可以简单地返回一个 const 引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 2017-03-09
    相关资源
    最近更新 更多