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::map 上可能的线程不安全操作

std::unordered_map 不断导致错误,这是一个错误吗?

visual studio 2017 STL 可视化器因一个 std::map<MyIntrusivePtr, std::tuple<....>> 失败

std::streams 已经可以移动了吗?

[C++][转载]std::map用法

c ++有没有可能`map.end()`在`std::map`的生命周期内改变