Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使数据可用于类的所有对象?_C++_Class_Oop_Field - Fatal编程技术网

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

C++ 如何使数据可用于类的所有对象?,c++,class,oop,field,C++,Class,Oop,Field,这可能是非常基本的,但不知何故我无法理解 假设我有一个类a,它嵌入了42个Things,加上一些公共数据: class A { Thing things[42]; int common_data[1024]; } 我希望每个对象都能访问公共数据,但我不想复制每个对象中的数据,也不想为每个对象中指向它的指针付出代价。换句话说,我希望东西看起来像这样: class Thing { int ident; int f() { return common_data[ident];

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

假设我有一个类
a
,它嵌入了42个
Thing
s,加上一些公共数据:

class A {
  Thing things[42];
  int common_data[1024];
}
我希望每个
对象都能访问公共数据,但我不想复制每个对象中的数据,也不想为每个对象中指向它的指针付出代价。换句话说,我希望
东西
看起来像这样:

class Thing {
  int ident;
  int f() {
    return common_data[ident];
  }
}
当然这里的
common_数据
是未绑定的。什么是使这项工作正常的方法


我正在使用一个C++子集,没有动态分配(没有“新”),没有继承,基本上是用漂亮的语法调用方法和声明对象的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 */
  }
};

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

class A 
{
  private:
    Thing things[42];
  public:
    static int common_data[1024];
}
可以通过执行以下操作来访问它

A::common_data[index];

你回避指针/参考的理由是基于非理性的恐惧。对机器来说,“复制”指针42次算不了什么(仔细阅读这个词)。此外,这绝对不是应用程序的瓶颈

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

因此,我推荐以下解决方案:

struct Thing {
    using data = std::shared_ptr<std::array<int, 1024>>;
    data common_data;
    Thing(data arg)
        : common_data(arg)
        {}
    // ...
};
struct东西{
使用data=std::shared\u ptr;
公共数据;
事物(数据arg)
:公共_数据(arg)
{}
// ...
};

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

让它成为静态的member@tobi303 ... 类的
事物的
?但是我无法从
A
访问它,对吗?在相关的时候将
公共_数据
传递给
东西
方法。那么我误解了这个问题。对于common,您的意思是
A
东西之间的common
?为什么不能传递指针?如果只是传递一个引用或一个指向公共_数据的指针,那么就不会进行任何动态分配。然而,如果你真的束手无策,不想传递任何类型的指针。您始终可以将公共_数据的元素逐个复制到对象。每当有公共_数据更新时,使用set方法更新每件事。感谢您的帮助@tobi303。您的解决方案的问题是,每次需要时,我都必须显式地将数据作为参数传递(如果您没有类,则必须以相同的方式将数据作为参数显式传递,例如在C中)。我一直在寻找一种方法,使我的函数
f
或您的函数
doSomethingWithCommonData
不将数据作为参数,而是将其放在作用域中,就像它是一个字段一样(甚至:以某种方式将其设为字段,但保留从
a
访问)@mqtthiqs您的类设计似乎有问题。如果您担心传递数据,那么1)考虑它是通过引用(不涉及任何副本)2)您可以做任何代码> > <代码> >直接在<代码>::Foo(但随后<代码> A <代码>可能需要访问<代码>事物< /代码>私有成员)@tobi303在之前的评论中,他表示不想复制指针。如果通过引用传递,它将复制每个实例的指针。除了拥有一个静态类,或者像你建议的那样通过引用传递之外,我真的不知道该怎么做。我明白你所说的2)是什么意思了,谢谢。大约1)如果我没有错的话,将引用本身从复制到被调用方的堆栈帧,并在每个
Thing
实例中取消对该指针的引用,这似乎是一种浪费,因为我们静态地知道
公共_数据
存储在哪里。@mqtthiq不必担心传递单个指针。如果这对运行时有可测量的影响,我会感到惊讶的。再次感谢你们两位!