2017-09-19 1 views
2

多型とマップを試すためのサンプルC++プログラムを書いていました。 私は、次のマップがありますC++のstd :: mapは "*"に失敗していますか?

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

用語を見上げて「メモリリーク」し、再度 'new'を使用することはありません。 – nwp

+6

'*'は多くのシェルの特殊文字です。これは基本的に現在のディレクトリ内のすべてのファイルに展開され、 '1 \ * 1'を渡すようにしてください。 – Holt

+0

@nwpもし私がこれを掃除すれば、それは漏れではありません。私はそれがおもちゃのプログラムであり、すべてがすぐに死ぬからではありません! – magicleon

答えて

3

問題は、それがクール代わりに生のポインタ—ではなく、あなたがそれを実行すると、あなたのプログラムに引数を渡す方法のunique_ptrを使用することによって改善することがあっても、あなたのC++コード—ではありません。

*文字は、シェルの多くでは特別な意味を持っており、一般的に、現在のディレクトリ内のファイルのリスト、例えばに展開する:あなたはバックスラッシュでエスケープするか必要

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

\

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

一部のシェルでも標準引用符で*を拡大する可能性があるため、私は、バックスラッシュのバージョンを使用することをお勧めします:あなたのプログラムを呼び出すときに、引用符の中にそれを渡します。

あなたはどうしたらあなたの場合

、あなたのプログラムがmain呼び出された場合、:

$ ./main 1 \* 1 ex 
+0

私の焦点は今地図上にありました。私は確かに 'unique_ptr'を調べます!ありがとうございました! – magicleon

関連する問題