C ++ std :: map在“*”上失败了吗?

时间:2017-09-19 12:00:59

标签: c++ polymorphism stdmap

我正在编写一个示例c ++程序来试验多态性和地图。 我有以下地图:

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

每个类都继承自Operation并按名称建议操作。

Everytrhing工作正常,但当我访问ops['*']时,程序崩溃了。如果我使用其他char,请说:

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

该计划有效。

整个main函数是这样的:

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

我会重复我的问题:

如果我将1 * 1传递给主要邮件,则会发生崩溃(SegmentationFault) 如果我编辑代码并通过1 x 1,它就可以正常工作。

std::map有什么我遗漏的东西吗?也许与*相关的东西被用作通配符或什么?

1 个答案:

答案 0 :(得分:3)

问题不在于你的C ++代码 - 即使使用unique_ptr代替原始指针也可以改进它 - 而是在运行时将参数传递给程序的方式。

*字符在许多shell中具有特殊含义,通常会扩展到当前目录中的文件列表,例如:

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

您需要使用反斜杠\对其进行转义,或者在调用程序时将其传递给引号:

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

我建议使用反斜杠版本,因为即使在标准引号内,某些shell也可能会扩展*

在您的情况下,如果您的程序被调用main,您可以执行以下操作:

$ ./main 1 \* 1 ex