2010-11-11 21 views
0

J'ai un problème complexe avec les tableaux statiques "prioritaires". J'ai des tableaux statiques (pour la simplicité) qui sont de longueur fixe dans différentes classes dérivées, mais toutes les tailles sont connues à la compilation. J'ai aussi une fonction virtuelle dans la classe de base, mais je ne sais pas comment résoudre le problème de surcharger ces tableaux et tailles de tableaux dans les classes dérivées afin que cette fonction virtuelle fonctionne correctement, c.-à-d. contenu des classes dérivées. Exemple:Remplacement des membres statiques et des "tableaux statiques statiques"

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 
} 

Pourriez-vous suggérer une solution ou d'une autre façon de faire cela correctement? Je pense que std :: vector le ferait (?), Mais a besoin de beaucoup de travail pour s'adapter à mon code existant. Un grand merci, Peter

Répondre

1

Puisque f est seulement défini dans la classe de base, il utilisera cette variable n de classe.

Peut-être déplacer:

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

une fonction séparée, mais vous l'avez donc passer dans ce qui est « n ». comme

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

et ont chaque sous-classe f mettre en œuvre() pour appeler doStuff (n) où n sera propre variable n de chaque classe.

1

Vous pouvez utiliser le modèle de modèle curieusement récurrent pour que votre fonction accède au tableau statique dans la classe la plus dérivée.

+0

Merci beaucoup, j'ai essayé comme vous l'avez suggéré et cela fonctionne comme prévu. Malheureusement, je veux pouvoir utiliser le polymorphisme dynamique sur l'interface B, ce qui n'est pas possible de cette manière. Ou est-ce? – Peter