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

时间:2011-10-10 18:15:42

标签: c++ class data-structures sharing

我有一个A类,包含一堆内部数据结构(例如m_data)和一些对象(例如ClassB):

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的子类可能不是干净的(?)..

5 个答案:

答案 0 :(得分:4)

friend class ClassB;

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

答案 1 :(得分:4)

其中一个:

  • 让ClassB成为A
  • 的朋友
  • 制作一个ClassB的子类并制作m_data protected而不是private

[回应Mark B的评论]

如果您认为需要诉诸friend关系,则应重新考虑设计 - 这可能不合适。分类可能有意义也可能没有意义;你必须问自己“class A有点 class ClassB吗?”如果问题没有直观意义,或者答案只是 no ,那么这可能是一个不恰当的解决方案。

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:0)

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

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

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

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

答案 4 :(得分:0)

  

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

取决于使用情况。

这是我该怎么做的:

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

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