2010-11-11 4 views
0

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

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 сделал бы это (?), Но ему нужно много работы, чтобы адаптироваться к моему существующему коду. Большое спасибо, Peter

ответ

1

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

Возможно двигаться:

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; 
    } 
} 

И есть каждый подкласс реализации п() для вызова DoStuff (п), где п будет собственный п переменной для каждого класса.

1

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

+0

Большое спасибо, я попробовал это, как вы предложили, и работает, как и ожидалось. К сожалению, я хочу иметь возможность использовать динамический полиморфизм над интерфейсом B, который, я думаю, невозможен таким образом. Или это? – Peter