我正在编写一个示例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
有什么我遗漏的东西吗?也许与*
相关的东西被用作通配符或什么?
答案 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