访问类中的内部数据结构的最佳方式是什么?

What's the best way to access the internal data structure within a class?

本文关键字:方式 是什么 最佳 内部 访问 数据结构      更新时间:2023-10-16

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

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

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

//更新:非常感谢你的回复。让我提供更多的背景信息。我正在研究一个人工智能项目,在那里我得到了一些数据(例如m_data[I])在每个时间步骤。类A需要缓冲这些信息(m_data),并使用B的列表(示例更新)来进行推断。类B本身实际上是一个基类,不同的子类出于不同的目的从它派生,所以我想在这种情况下,使B成为a的子类可能不干净(?).

friend class ClassB;

如果你想让ClassB访问A的所有受保护成员和私有成员,就把这行放在A声明的任何地方。

其中之一

  • 让b类成为a类的朋友
  • 使A成为类b的子类,并使m_data protected而不是private

[回应Mark B的评论]

如果你觉得需要求助于friend关系,设计应该重新考虑-它可能不合适。子类化可能有意义,也可能没有意义;你必须问自己:"class A有点 class ClassB吗?"如果这个问题在直觉上没有意义,或者答案只是没有,那么它可能是一个不合适的解决方案。

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

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

  • 您可以提供简单的get/set访问方法,这取决于您的需求,可用于访问的副本或m_data的引用。这样做的缺点是允许每个人访问,但只能通过定义良好的接口来实现
  • ggPeti提到使用friend,这可能对您有用,但它使ClassB访问a的所有内部。

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

因此,在类B的函数中,您将创建一个指向您创建的类类型a变量的指针。我们就称这个指针为'p'。

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

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

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

取决于用途。

我要这样做:

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

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