如何使数据可用于类的所有对象?

时间:2016-07-21 16:25:35

标签: c++ class oop field

这可能是非常基本的但不知何故我无法弄明白。

假设我有一个A课程,其中嵌入了42 Thing个,以及一些常见数据:

class A {
  Thing things[42];
  int common_data[1024];
}

我希望每个thing都可以访问公共数据,但我不想复制每个Thing对象中的数据,也不想在每个东西中支付指向它的指针的价格。换句话说,我希望Thing看起来像这样:

class Thing {
  int ident;
  int f() {
    return common_data[ident];
  }
}

当然这里common_data是未绑定的。使这项工作的规范方法是什么?

FWIW我正在使用没有动态分配的C ++子集(没有“new”,没有继承,基本上它是C语言,调用方法和声明对象的语法很好);我理想地寻找适合这个子集的解决方案。

3 个答案:

答案 0 :(得分:1)

我不确定我是否正确理解了这个问题,但也许这会有所帮助:

struct A {
  Thing things[42];
  int common_data[1024];
  void foo(int index) {
      things[index].doSomeThingWithCommonData(int* common_data);
  }
};

struct Thing {
  void doSomeThinWithCommonData(int* common_data) {
      /* now you have access to common_data */
  }
};

答案 1 :(得分:1)

您可以通过将A类的common_data属性设置为静态来解决您的问题。静态变量由A类的所有成员共享,如果将其公开,则可以访问。

class A 
{
  private:
    Thing things[42];
  public:
    static int common_data[1024];
}

可以通过执行...

来访问它
A::common_data[index];

答案 2 :(得分:0)

避免指针/参考的原因是基于非理性的恐惧。 "复制" 42次指针是机器的 nothing (仔细阅读这个单词)。此外,这绝对是应用程序的瓶颈。

所以惯用的方法是简单地使用依赖注入,这对你来说确实是一个稍微昂贵的动作(如果传递一个数组可以被认为是昂贵的),但允许更加分离的设计

因此,这是我推荐的解决方案:

struct Thing {
    using data = std::shared_ptr<std::array<int, 1024>>;
    data common_data;
    Thing(data arg)
        : common_data(arg)
        {}
    // ...
};

如果系统已经过成本计算,那么您应该对程序进行基准测试。我几乎可以肯定地告诉你,瓶颈不会复制那42个指针。