2017-09-19 6 views
2

J'écrivais un exemple de programme C++ pour expérimenter le polymorphisme et les cartes. J'ai la carte suivante:C++ std :: map échoue sur "*"?

map<char,Operation*> ops; 
ops['+'] = new Addition(); 
ops['-'] = new Subtraction(); 
ops['*'] = new Multiplication(); 
ops['/'] = new Division(); 

chaque classe hérite de Operation et fait l'opération suggérée par son nom.

Everytrhing fonctionne correctement, mais lorsque j'accède au ops['*'], le programme plante. Si j'utilise un autre char, dire ceci:

ops['x'] = new Multiplication(); 

le fonctionnement du programme.

L'ensemble de la fonction main est la suivante:

int main(int argc, char** argv){ 
    int x = atoi(argv[1]); 
    char op = argv[2][0]; 
    int y = atoi(argv[3]); 
    map<char,Operation*> ops; 
    ops['+'] = new Addition(); 
    ops['-'] = new Subtraction(); 
    ops['*'] = new Multiplication(); 
    ops['/'] = new Division(); 
    cout<<ops[op]->op(x,y)<<endl; 
} 

Je répète mon problème:

Si je passe 1 * 1 au principal, un accident se produit (SegmentationFault).
Si je modifie le code et passe 1 x 1 cela fonctionne très bien.

Y a-t-il quelque chose qui me manque de std::map? Peut-être quelque chose lié à * étant utilisé comme un caractère générique ou quelque chose?

+0

rechercher le terme « fuite de mémoire » et ne jamais utiliser 'new' nouveau. – nwp

+6

'*' est un caractère spécial dans un grand nombre de shells, qui se développe essentiellement dans tous les fichiers du répertoire en cours. Essayez de passer '1 \ * 1'. – Holt

+0

@nwp Ce n'est pas une fuite si je nettoie quand je le devrais. Ici, je ne le fais pas parce que c'est un programme de jouets et tout meurt tout de suite! – magicleon

Répondre

3

Le problème est pas votre code C++ — même si elle est fraîche améliorée en utilisant unique_ptr au lieu des pointeurs premières — mais plutôt la façon dont vous passer des arguments à votre programme lorsque vous l'exécutez.

Le caractère * a une signification particulière dans un bon nombre de coquille, et d'élargir généralement à la liste des fichiers dans le répertoire courant, par exemple:

$ ls 
main.cpp main 
$ echo 1 * 1 
1 main.cpp main 1 

Vous devez soit échapper avec une barre oblique inverse \ ou transmettre entre guillemets lorsque vous appelez votre programme:

$ echo 1 \* 1 
1 * 1 
$ echo 1 "*" 1 

Je vous recommande d'utiliser la version barre oblique inverse parce que certains shell peut développer * même entre guillemets standard.

Dans votre cas, si votre programme est appelé main, vous feriez:

$ ./main 1 \* 1 ex 
+0

Mon objectif était sur la carte en ce moment, je vais sûrement regarder dans 'unique_ptr'! Je vous remercie! – magicleon