C ++ std :: map在“*”上失败了吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++ std :: map在“*”上失败了吗?相关的知识,希望对你有一定的参考价值。
我正在编写一个示例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
?也许与*
相关的东西被用作通配符或其他东西?
答案
问题不在于你的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
以上是关于C ++ std :: map在“*”上失败了吗?的主要内容,如果未能解决你的问题,请参考以下文章
std::unordered_map 不断导致错误,这是一个错误吗?
visual studio 2017 STL 可视化器因一个 std::map<MyIntrusivePtr, std::tuple<....>> 失败