这可能是非常基本的但不知何故我无法弄明白。
假设我有一个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语言,调用方法和声明对象的语法很好);我理想地寻找适合这个子集的解决方案。
答案 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个指针。