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不必担心传递单个指针。如果这对运行时有可测量的影响,我会感到惊讶的。再次感谢你们两位!