覆盖静态成员和“静态静态数组”

时间:2010-11-11 15:07:32

标签: c++ arrays inheritance static virtual

我有一个“覆盖”静态数组的棘手问题。我有静态数组(为简单起见),它们在不同的派生类中具有固定长度,但仍然在编译时都知道所有大小。我在基类中也有一个虚函数,但我不知道如何解决在派生类中重写这些数组和数组大小的问题,以便这个虚函数正常工作,即给出大小和数组派生类的内容。例如:

class B  {
private:
 // these two are not really meaningful in this class (ABC)
 static const int n = 1;
 static double da[n];
public:

 virtual void f()
 {
  for(int i = 0; i < n; ++i)
  {
   // do something with n and da
   std::cout << n << std::endl;
  }
 }
};

class D1 : public B  {
private:
 // these are subclass-specific (i.e. n might also change)
 static const int n = 4;
 static double da[n];
};

class D2 : public B  {
private:
 // these are subclass-specific (i.e. n might also change)
 static const int n = 6;
 static double da[n];
};


double D1::da[] = {1., 2., 3., 4.};
// ...

int main()
{
 B *p = new D;
 p->f(); // I'd like to see 4 instead of 1
}

您能否正确地提出修复方法或其他方法?我认为std :: vector会做(?),但需要做很多工作才能适应我现有的代码。 非常感谢, 彼得

2 个答案:

答案 0 :(得分:1)

由于f仅在Base类中定义,因此它将使用该类'n变量。

或许搬家:

for(int i = 0; i < n; ++i) 
  { 
   // do something with n and da 
   std::cout << n << std::endl; 
  }

要一个单独的功能,而是拥有它,所以你传入“n”是什么。像

void doStuff(int num) {
    for(int i = 0; i < num; ++i) 
    { 
      // do something with n and da 
      std::cout << num << std::endl; 
    }
}

让每个子类实现f()来调用doStuff(n),其中n将是每个类'自己的n变量。

答案 1 :(得分:1)

您可以使用奇怪的重复模板模式使您的函数访问派生程度最高的类中的静态数组。