【问题标题】:Access private member vector of multiple objects in other class访问其他类中多个对象的私有成员向量
【发布时间】:2017-08-03 08:57:28
【问题描述】:

我有两个具有相似结构的类(A 和 B),它们都包含一个结构向量。

class A/B{
private: std::vector<DataStruct> vec_A/vec_B;
...
public:
...
}

要创建/更新 B 的对象,我必须组合 A 类的多个对象的向量中的数据(将向量中的相似条目组合成对象 B 的向量中的一个条目,并在 B 中进行数据转换) .

我该怎么做?

我的想法是:

  • 让 B 类成为 A 的朋友。但我听说,在 C++ 中让类成为朋友只是最后的手段,应该避免。
  • 在 A 类中编写 getVector() 函数,该函数返回对 Vector vec_A 的引用,以便 B 类可以对数据进行操作。对我来说,这似乎只是绕过了数据封装。将向量设置为公开有什么好处?
  • 在 A 类中编写 getVector() 函数,该函数返回 vec_A 的副本。但由于vec_A 不是那么小,这似乎效率低下(好吧,只有几 kB。应该可以工作,但总的来说......)
  • 为 A 类编写一个函数,该函数进行计算并创建 B 类的对象。然后将 B 的多个对象连接到 B 的最终对象中。但是,这对我来说似乎是很多开销。李>

【问题讨论】:

  • 你考虑过给 B 一个常量引用 vec_A 吗?
  • @Xatyrian 不,但这似乎是个好主意

标签: c++ c++11 encapsulation


【解决方案1】:

在 A 类中编写一个 getVector() 函数,该函数返回一个引用 到Vector vec_A,这样B类就可以对数据进行操作了。为了我 这似乎只是绕过了数据封装。会是什么 将向量设置为公共的优势?

如果B只需要观察vec_A的内容,可以考虑返回一个const引用(const &amp;):

class A {
 ...
  public:

    // Give read-only access to vec_A
    const std::vector<DataStruct> & getVector() const {
        return vec_A;
    }
};

我更喜欢这种解决方案,而不是仅仅公开矢量数据成员:使用访问器(getter/setter)你可以更好地控制。例如,您可以实现只读访问(如上所示)。或者,如果你想提供一个 setter,你也可以对输入参数进行一些检查等。

【讨论】:

    猜你喜欢
    • 2012-02-18
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    相关资源
    最近更新 更多