2009-09-16 5 views
0

J'ai un code similaire à ce qui suit:Quelle est la meilleure façon de stocker et d'instancier la liste des classes en C++ sans utiliser STL?

class News { 
public: 
    virtual void get() = 0; 
} 

class Cnn : News { 
    void get() {...} 
} 

class Msnbc : News { 
    void get() {...} 
} 

class Bbc : News { 
    void get() {...} 
} 


main() 
{ 
News * news = new Cnn; 
news->get() 

News * news = new Msnbc; 
news->get() 

News * news = new Bbc; 
news->get() 
} 

Au lieu de créer chaque sous-classes, quelle est la meilleure façon de stocker les sous-classes (Cnn, ... MSNBC) et itérer sur et obtenir une des nouvelles de tous les flux (je ne peux pas utiliser STL à un moment)

Merci

+4

Pourquoi ne pas utiliser STL? C'est comme dire que vous ne pouvez pas utiliser C++ :(Homework? – GManNickG

+1

Quelle est la raison de ne pas utiliser STL? Vous devez utiliser une classe de conteneur - même si homegrown - pour gérer l'allocation./questions/712639/please-help-us-non-c-developers-understand-what-raii-is.) Si ce n'est pas une option non plus, c'est 'new News * []' – peterchen

+0

Ça sent les devoirs ... –

Répondre

2

Si vous ne pouvez pas utiliser STL alors votre meilleur pari est d'utiliser un tableau de Nouvelles *.

News*[] GetAllNews(int& count) { 
    News*[] arr = new News*[3]; 
    count = 3; 
    arr[0] = new Cnn(); 
    arr[1] = new Msnbc(); 
    arr[2] = new Bbc(); 
    return arr; 
} 

int count; 
News*[] arr = GetAllNews(count); 
for (int i = 0; i < count; i++) { 
    arr[i]->get(); 
} 

// Now for the awkward cleanup 
for (int i = 0; i < count; i++) { 
    delete arr[i]; 
    arr[i] = NULL; 
} 
delete[] arr; 
+0

Je sais que beaucoup seront en désaccord avec moi, mais vous (a) faites au moment de l'exécution ce qui aurait dû être au moment de la compilation et (b) soyez trop verbeux. –

+1

@hacker, vous êtes allé pour une solution plus statique alors que je suis allé pour un plus dynamique. Le dynamique est nécessairement plus verbeux. – JaredPar

+0

Voilà le point - votre code semble être traduit de la langue dynamique - C++ n'est pas votre natif, n'est-ce pas? ;-) En fait, je dirais que vous êtes trop bavard pour une manière complètement dynamique aussi. Encore une fois - c'est mon opinion, que beaucoup seront en désaccord avec. –

0
News *n[] = { new Cnn(), new Msnbc(), new Bbc() }; 
for(News **p=n;p<&n[ sizeof(n)/sizeof(*n) ];++p) { 
    (*p)->get(); 
    delete *p; 
} 
+0

Pourquoi les downvotes? C'est peut-être concis comme réponse, mais cela répond à la question. L'approche statique est également valable, en particulier dans les petits systèmes embarqués qui ne peuvent pas utiliser le C++ complet. – stefaanv

+0

Allez les gars, c'est une bonne réponse - concis et correct. +1 (Serait gentil de diviser l'astuce count-count 'sizeof' dans un modèle de fonction inline séparé pour plus de clarté vous.) –

+0

Merci les gars. j_random_hacker, oui, dans le vrai code de la vie qui aurait du sens, mais dans la réponse, je pense que cela donne une meilleure idée de ce qui se passe. Au moins, c'était ma motivation pour l'intégrer ici. –

Questions connexes