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

问题描述 投票:2回答:1

我正在编写一个示例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++ polymorphism stdmap
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.