2016-06-24 2 views
0

У меня есть карта, которая хранит компоненты многочлена. Ключ является показателем, а значение - коэффициентом. Карта с целыми ключами и целыми значениями. Я повторяюсь в своей функции печати, программа вылетает, когда я выполняю свою итерацию. Когда я вводил ключи в свои массивы, все, казалось, проверялось. Входной файл имеет следующий формат -1 0 5 1 20 3 2 -9 -2 1 1 2 3 1 -2 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; 
} 
+1

'std :: map * pol;' - не нужно, чтобы это было указателем, а затем использовалось 'new' и' delete'. Все, что вам нужно, это 'std :: map pol;'. Кроме того, вы можете очистить форматирование? Это повсюду, что затрудняет чтение вашего кода. – PaulMcKenzie

+1

Также, пожалуйста, напишите [mcve], что означает функцию 'main'. Причина в том, что я могу легко сломать вашу программу (все из-за указателя, о котором я упоминал), с простой 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 Three станет The Rule of Five.

+0

В GCC вы можете включить: -Wshadow, который должен предупредить вас в этой ситуации. – Alex

+1

Для C++ 11 правило три стало правилом пять. Это становится нормой нуля для (помимо прочего) классов, которые явно не управляют ресурсом (например, если 'pol' становится« map », а не указателем на один). – Peter

Смежные вопросы