如何将member变量作为变量传递给

时间:2016-06-08 15:42:29

标签: c++ class member void

想象一下,你有一个包含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的内容。

2 个答案:

答案 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这样的变量名,这实际上看起来非常糟糕,但我想我们在这里尝试一般,并且实际程序具有有意义的名称。