2010-06-22 15 views
2

Fondamentalement, j'ai une liste liée qui implémente une fonction display() qui boucle simplement à travers les éléments et imprime leurs valeurs.Comment utiliser Enum avec des chaînes dans une fonction?

que je voulais faire comme ceci:

void List::display(std::string type) 
{ 
    switch(type) 
    { 
     // Do stuff... 

Le compilateur se plaint immédiatement. Mon professeur a dit que ce serait parce que la chaîne n'est pas connue à la compilation, ce qui entraîne une erreur. Cette explication semble un peu incertaine, mais il m'a suggéré d'utiliser des énumérations. Donc je l'ai recherché et il dit que la chaîne explicite à enums ne fonctionne pas. Quelque chose comme

class List 
{ 
    enum type 
    { 
     HORIZONTAL = "inline" 
     VERTICAL = "normal" 
    } 

et puis, je ne sais vraiment pas. Le enum type fait partie de la classe List, ainsi que la fonction display(). Cela ressemble encore à une solution vraiment merdique. Néanmoins, je veux savoir si cette approche est possible.

Comment est-ce que je pourrais définir l'enum dans la fonction principale en même temps que j'appelle display()? Comme si

int main(void) 
{ 
    display("normal"); 

Bien sûr, les approches plus faciles sont les bienvenues. En général, comment déclarer/passer une énumération à une fonction, si possible?

Répondre

2

Le commutateur, dans C++ actuel, ne fonctionne qu'avec des types entiers. Vous pouvez définir votre énumération, l'activer et écrire une fonction auxiliaire qui mappe l'énumération en valeurs de chaîne si nécessaire.

Exemple

enum E { A, B }; 

string E_to_string(E e) 
{ 
    switch(e) 
    { 
    case A: return "apple"; 
    case B: return "banana"; 
    } 
} 

void display(E e) 
{ 
    std::cout << "displaying an " << E_to_string(e) << std::endl; 
    switch(e) 
    { 
    case A: // stuff displaying A; 
    case B: // stuff displaying B; 
    } 
} 
2
class List 
{ 
    enum Type 
    { 
     HORIZONTAL, 
     VERTICAL 
    }; 

    void display(Type type) 
    { 
     switch (type) 
     { 
      //do stuff 
     } 
    } 
}; 

int main() 
{ 
    List l; 
    l.display(List::HORIZONTAL); 
} 
+0

C'est voodoo! Assez cool, je ne savais pas que tu pouvais le faire comme ça. Merci! – IAE

+0

Est-ce que 'Type' doit être public pour être utilisé comme paramètre de' display'? –

+0

Non, mais si vous le rendez privé, vous ne pouvez pas y accéder dans 'main' et vous ne pouvez donc pas appeler' display' à partir de là. – Job

Questions connexes