想象一下,你有一个包含100个或更多成员变量的类:
class DataContainer { int a1; int a2; ... double a100; };
和另一个访问和分析第一类变量部分的类:
class Analysis {
protected:
DataContainer *myData;
void myVar1, myVar2;
public:
Analysis() {...}
void myChoice(void a, void b) { myVar1 = a; myVar2 = b }
void Analyse(DataContainer data) {
myData = data;
/* do something with myVar1 and myVar2 */
}
};
但在分析之前,您必须选择要使用的参数。我想知道如何为这个myChoice函数编写一个调用,它不仅仅是传递变量的内容,而是传递成员变量本身。
为了更一般地问:我认为类成员的内存中相对于类本身的位置是固定的(是吗?)如果它是该类的新实例,则不相关。那么我怎么能告诉组合器“请始终使用membervariable a3”。而不是a3的内容。
答案 0 :(得分:1)
这正是pointers-to-data-members的用途。
int DataContainer::* myVar1 = &DataContainer::a1;
double DataContainer::* myVar2 = &DataContainer::a100;
确实如此。相对位置在运行时不会改变。这就是指向数据成员的工作原因。它们可以实现为内存偏移量。我认为类成员在内存中相对于类本身的位置是固定的(是吗?)
PS。考虑到DataContainer
的大小,如果你能避免它,我建议不要按值传递它。
PPS。考虑将成员变量分组为子结构。
答案 1 :(得分:0)
如果目的是根据您正在进行的分析类型,以已知的方式选择特定字段,则将Analyze虚拟化为纯,并使特定类型的分析直接选择其字段。
从这个问题来看,我认为你想要执行相同的底层计算,但是根据myChoice使用不同的数据点。
所以整个问题是如何创建选择元数据?如果有一些具体的,记录良好的方法,那么在子类中提供每个方法将是一个非常清晰,简洁和可维护的方法。
class Analysis {
public:
virtual void Analyze(const DataContainer &data) = 0;
virtual ~Analysis();
protected:
void special_computation(int x, int y, double z);
};
class SpecificKindOfAnalysis : public Analysis {
public:
void Analyze(const DataContainer &data){
int x = data.a27;
int y = data.a12;
double z = data.a99;
special_computation(x,y,z);
}
};
对于像x = data.a27这样的变量名,这实际上看起来非常糟糕,但我想我们在这里尝试一般,并且实际程序具有有意义的名称。