如何使数据对 class 的所有对象可用?
How to make data available to all objects of a class?
这可能是非常基本的,但不知何故我无法理解。
假设我有一个 class A
嵌入了 42 Thing
s,加上一些常用数据:
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 个指针。
这可能是非常基本的,但不知何故我无法理解。
假设我有一个 class A
嵌入了 42 Thing
s,加上一些常用数据:
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 个指针。