2016-06-24 14 views
0

私は多項式の成分を格納しているマップを持っています。キーは指数であり、値は係数です。整数キーと整数値を持つマップ。私は自分の印刷機能を反復していますが、私の繰り返しをするとプログラムがクラッシュします。私がキーを私の配列に入れていた時、すべてがチェックアウトされたようでした。入力ファイルの形式は-1 0 5 1 20 3 -9すべての対が(係数、指数).`マップC++を反復する

//header 
#ifndef poly_h 
#define poly_h 
#include <map> 
class poly { 

private: 
    std::map<int, int>* pol; 

public: 
    poly(char* filename); 
    poly& operator+(poly& rhs); 
    poly& operator-(poly& rhs); 
    poly& operator*(poly& rhs); 
    void print(); 
    ~poly(); 
}; 
#endif 


//cpp file 
#include "poly.h" 
#include <iostream> 
#include <fstream> 
using namespace std; 
poly::poly(char* filename) 
{ 

    map<int, int>* pol = new map<int, int>; 
    ifstream input_file; 
    input_file.open("input.txt"); 
    int coe; 
    int exp; 

    while (input_file >> coe) { 
     input_file >> exp; 
     cout << coe << " ^" << exp << " "; 
     map<int, int>::iterator it = pol->find(exp); 
     if (it == pol->end()) { 
      (*pol)[exp] = coe; 
     } 
     else { 
      (*pol)[exp] += coe; 
      if ((*pol)[exp] == 0) { 
       pol->erase(it); 
      } 
     } 
     cout << (*pol)[exp]; 
     //print(); 
     cout << endl; 
    } 
    input_file.close(); 
} 
void poly::print() 
{ 
    cout << "inside print<<endl;                 
     for (map<int, int>::iterator outer_iter = pol->begin(); outer_iter != pol->end(); ++outer_iter); 
    cout << "done"; 
} 
poly::~poly() 
{ 
    delete pol; 
} 
ある2 -2 1 1 2 -2 3 1 9、
+1

'std :: map * pol;' - これはポインタである必要はなく、後で 'new'と' delete'を使う必要はありません。必要なのは 'std :: map pol;'です。また、書式を整理できますか?それはあなたのコードを読むのを難しくしています。 – PaulMcKenzie

+1

また、[main]機能を意味する[mcve]も投稿してください。その理由は、簡単な2行または3行のプログラムで(私が指摘したポインタのために)あなたのプログラムを簡単に破ることができるからです。また、演算子+、 - 、および*は、参照ではなく新しい 'poly'オブジェクトを返す必要があります。 – PaulMcKenzie

+0

cout <<(* pol)[exp]; 上記の数行を消去するので、値が0になると破損すると思います。 – Alex

答えて

1

ライン

map<int, int>* pol = new map<int, int>; 

が犯人です。関数ローカル変数を作成します。メンバー変数の値は設定されません。結果として、同じ名前のメンバ変数は初期化されません。他の関数でその変数を参照解除すると、未定義の動作が発生します。並ぶ

変更:

pol = new map<int, int>; 

としては、私は強く、オブジェクトへのポインタからそのメンバ変数を変更する助言、コメントの一つで示唆されました。オブジェクトを使用することから自動的にメモリ管理が行われます。メモリの割り当てにnewを使用し、deleteを使用してメモリの割り当てを解除することについて、心配する必要はありません。それだけでなく、あなたのクラスでメモリを割り当てる仕事をする場合は、The Rule of Threeについて知り、クラスがそれらのルールを確認していることを確認する必要があります。

C++ 11コンパイラを使用している場合、The Rule of ThreeThe Rule of Fiveになります。

+0

GCCでは、次のように設定することができます:-Wshadowこれは、このような状況で警告するはずです。 – Alex

+1

C++ 11の場合、3つのルールが5つのルールになりました。これは、リソースを明示的に管理しないクラス(とりわけ、 'pol'が1つのポインタではなく ''になる場合)のためのゼロのルールになります。 – Peter

関連する問題