【问题标题】:What's the best way to access the internal data structure within a class?访问类中的内部数据结构的最佳方式是什么?
【发布时间】:2011-10-10 18:15:41
【问题描述】:

我有一个由一堆内部数据结构(例如 m_data)和一些对象(例如 ClassB)组成的 A 类:

class A
{
public:
      ...
private:
      int m_data[255];
      ClassB B[5];
}

B 访问 m_data 的最佳方式是什么?我不想将 m_data 传递给 B 的函数..

// 更新: 非常感谢您的回复。让我提供更多上下文信息。 我正在做一个 AI 项目,我在每个时间步都得到了一些数据(例如 m_data[i])。 A 类需要缓冲这些信息(m_data)并使用 B 的列表(示例更新)进行推理。 B 类本身实际上是一个基类,不同的子类出于不同的目的从它派生,所以我猜在这种情况下,使 B 成为 A 的子类可能不干净(?)..

【问题讨论】:

  • B 的实例是否会存在于 A 类的实例之外?
  • @mkb:如果不是,它应该是一个嵌套类。
  • 这个问题中没有足够的信息让我们用健全的 C++ 方法来回答它。您能否进一步详细说明AB之间的关系、它们的用法以及需要访问m_dataB的方法?

标签: c++ class data-structures sharing


【解决方案1】:
friend class ClassB;

如果您希望 ClassB 访问 A 的所有受保护成员和私有成员,请将此行放在 A 的声明中的任何位置。

【讨论】:

  • 请记住,这相当于说“我想从客厅进入厨房,所以我会用大锤敲掉挡在路上的墙” 。”它会起作用,它肯定是一个有效的解决方案,但也许一扇门会是一个更清洁的选择。
【解决方案2】:

其中之一:

  • 让 ClassB 成为 A 的朋友
  • 将 A 设为 ClassB 的子类,并将 m_data 设为 protected 而不是 private

[回应 Mark B 的评论]

如果您觉得有必要诉诸friend 关系,则应重新考虑设计 - 这可能不合适。子分类可能有意义,也可能没有意义;你必须问自己“class A某种 class ClassB 吗?”如果这个问题在直觉上没有意义,或者答案只是,那么它可能是一个不合适的解决方案。

【讨论】:

  • 这(可能)按字面意思回答了这个问题,但很可能会传播需要重新考虑的设计。
【解决方案3】:

理想情况下,您根本不允许外部访问数据结构。您应该重新考虑您的方法,更多地考虑“ClassB 访问 A 实例所需的功能要求/用例是什么”这个问题,而不是将内部成员的管理卸载到不在 class A 中管理的方法。您会发现将内部成员的管理限制在拥有这些成员的类将产生更简洁的代码,更易于调试。

但是,如果由于某种原因这对您的情况不切实际,那么您会想到以下几种可能性:

  • 您可以提供简单的 get/set 访问器方法,具体取决于 您的要求,可用于访问副本或 参考 m_data。这样做的缺点是允许所有人 访问,但只能通过定义明确的接口(可以 根据需要进行监控)。
  • ggPeti 提到使用朋友,这可能对您有用,但它使 ClassB 可以访问 A 的所有内部。

【讨论】:

    【解决方案4】:

    返回 m_data 的 getData() 函数。 使用 setData() 更改值。

    因此,在 B 类的函数中,您将创建一个指向您创建的类类型 A 变量的指针。让我们将此指针称为“p”。

    只需执行 p->getData(),p.getData() 可能就是答案。我认为他们做同样的事情,但 c++ 使用'->' 而其他一些语言使用'.'。不过不要引用我的话。

    祝你好运,先生。希望我能帮到你。

    【讨论】:

      【解决方案5】:

      B 访问 m_data 的最佳方式是什么?

      取决于用途。

      我会这样做:

      class ClassB
      {
        // ...
        void foo( A &a )
        {
          // use a's data
        }
      };
      class A
      {
        //...
        int m_data[255];
        ClassB & B;
      };
      

      根据实现的不同,可能根本不需要 ClassB。也许它的方法可以转换为函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        • 2014-09-24
        • 1970-01-01
        • 2021-06-14
        相关资源
        最近更新 更多