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

How to make data available to all objects of a class?

这可能是非常基本的,但不知何故我无法理解。

假设我有一个 class A 嵌入了 42 Things,加上一些常用数据:

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

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

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

当然这里common_data是未绑定的。使这项工作正常进行的方法是什么?

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

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

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 */
  }
};

您可以通过将 Class 的 common_data 属性设为静态来解决您的问题。静态变量由 class A 的所有成员共享,如果您将其设置为 public.

将可以访问
class A 
{
  private:
    Thing things[42];
  public:
    static int common_data[1024];
}

可以通过以下方式访问...

A::common_data[index];

您回避 pointers/reference 的原因是基于非理性的恐惧。 "Copying" 一个指针 42 次对于机器来说是 nothing(仔细阅读这个词)。而且这绝对不是应用程序的瓶颈。

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

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

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

如果系统受限,那么您应该对您的程序进行基准测试。我可以几乎绝对肯定地告诉你,瓶颈不会是复制那 42 个指针。