Переопределение статических элементов и «статических статических массивов» - PullRequest
0 голосов
/ 11 ноября 2010

У меня сложная проблема с переопределением статических массивов.У меня есть статические массивы (для простоты), которые имеют фиксированную длину в различных производных классах, но все же все размеры известны во время компиляции.У меня также есть виртуальная функция в базовом классе, но я не знаю, как решить проблему переопределения этих массивов и размеров массивов в производных классах, чтобы эта виртуальная функция работала правильно, то есть дает размеры и массивсодержимое из производных классов.Пример:

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 ]

1 голос
/ 11 ноября 2010

Вы можете использовать шаблон Curily Recurring Template Pattern, чтобы ваша функция обращалась к статическому массиву в наиболее производном классе.

1 голос
/ 11 ноября 2010

Поскольку f определяется только в базовом классе, он будет использовать переменную этого класса n.

Возможно, переместим:

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

в отдельную функцию, но вместо этого сделайте таквы переходите в то, что "н" есть.как

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 каждого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...