2016-06-19 4 views
1

J'ai écrit du code pour mon affectation de classe et quand je l'écrase dans un terminal avec la commande g ++, cela me donne une erreur de segmentation. Le code est gros mais première partie, quand j'insère des éléments de map, ça marche (car une fois qu'il a écrit la commande et ensuite écrasé) et puis quand il doit lancer (c'est une assignation avec des opérateurs Redéfinition) il plante. donc quelqu'un peut m'aider s'il vous plaît.erreur de segmentation (core dump) C++

#include <iostream> 
#include <map> 
#include <algorithm> 
#include <string> 
#include <typeinfo> 
#include "druga_verzija.h" 

using namespace std; 
//constructor 
Posiljka::Posiljka(){ 
    m.clear(); 

} 


//how to print my map 
ostream&operator<<(ostream&f, Posiljka&p){ 
    map<string , int>::iterator it; 
    it=p.m.begin(); 
    cout << it->second << "x" << it->first; 
    for(it=p.m.begin() ; it != p.m.end() ; ++it){ 
     cout << " " << it->second << "x" << it->first; 
    } 
} 

//how to insert elements 
Posiljka&Posiljka::operator<<(string s){ 
    if(m.empty()){ 
     m.insert(pair<string,int>(s,1)); 
     return *this; 
    } 
    map<string ,int>::iterator it=m.begin(); 
    for(; it != m.end() ; ++it){ 
     if(it->first == s){ 
      it->second++; 
      return *this; 
     } 
     if(it->first > s){ 
      m.insert(it, pair<string,int>(s , 1)); 
      return *this; 
     } 
    } 
    if(it == m.end()){ 
     m.insert(pair<string,int>(s, 1)); 
     return *this; 
    } 
} 

//how to delete them 
Posiljka&Posiljka::operator>>(string s){ 
    if(m[s]){ 
     m[s]=m[s]-1; 
     if(!m[s]){ 
      m.erase(s); 
      return *this; 
     } 
     return *this; 
    } 
    return *this; 
} 
//how to make new map that contains two old maps 
Posiljka Posiljka::operator|(Posiljka &p){ 
    Posiljka novi; 
    map<string,int>::iterator it; 
    for(it = p.m.begin() ; it!= p.m.end() ; ++it) 
     novi.m[it->first]=it->second; 
    for(it = m.begin(); it != m.end() ; ++it){ 
     if(novi.m[it->first]) 
      novi.m[it->first] = novi.m[it->first] + it->second; 
     else 
      novi.m[it->first] = it->second; 
     } 
    return novi; 
} 

//multiply map witn int and make new map 
Posiljka Posiljka::operator*(int x){ 
    map<string , int>::iterator it; 
    Posiljka novi; 
    for(it=m.begin() ; it!=m.end() ; ++it) 
     novi.m[it->first] = it->second * x; 
    return novi; 
} 

//write how much objects map has 
Posiljka::operator int(){ 
    int suma=0; 
    map<string , int>::iterator it; 
    for(it = m.begin() ; it != m.end() ; ++it) 
     suma = suma + it->second; 
    return (int)suma; 
} 
//write maks of one object 
int Posiljka::operator+(){ 
    int maks=0; 
    map<string, int>::iterator it; 
    for(it = m.begin() ; it != m.end() ; ++it) 
     if(it->second > maks) 
      maks=it->second; 
    return maks; 
} 

//write min of one object 
int Posiljka::operator-(){ 
    if(m.begin()->second) 
     return 0; 
    int mini=m.begin()->second; 
    map<string, int>::iterator it; 
    for(it=m.begin() ; it!=m.end() ; ++it) 
     if(it->second < mini) 
      mini=it->second; 
    return mini; 
} 
//if there is object s in thios map 
bool Posiljka::operator()(string s){ 
    if(m[s]) 
     return true; 
    else 
     return false; 
} 

mon principal:

#include <iostream> 
#include "druga_verzija.h" 
using namespace std; 
int main() 
{ 
Posiljka P, Q, R; 
P << "olovka" << "tipkovnica" << "olovka" << "olovka"; 
cout << P << endl; 
P << "olovka" << "monitor" << "tipkovnica" << "gitara"; 
cout << P << endl; 
//1xgitara 1xmonitor 4xolovka 2xtipkovnica 
cout << (int)P << endl; 
//8 
Q = P*2; 
cout << Q << endl; 
//2xgitara 2xmonitor 8xolovka 4xtipkovnica 
R = P | Q; 
cout << R << endl; 
//3xgitara 3xmonitor 12xolovka 6xtipkovnica 
cout << -R << " " << +R << endl; 
//3 12 
while (R("olovka")) 
R >> "olovka"; 
cout << R << endl; 
//3xgitara 3xmonitor 6xtipkovnica 
R >> "gitara" >> "monitor" >> "tipkovnica" >> "tipkovnica"; 
cout << R << endl; 
//2xgitara 2xmonitor 4xtipkovnica 
return 0; 
} 

mon interface:

#include <iostream> 
#include <map> 
#include <string> 
#include <typeinfo> 


using namespace std; 

class Posiljka 
{ 
private: 

map<string,int> m; 

public: 

Posiljka(); 
friend ostream&operator<<(ostream&, Posiljka&); 
Posiljka&operator<<(string s); 
Posiljka&operator>>(string s); 
Posiljka operator|(Posiljka &p); 
Posiljka operator*(int x); 
operator int(); 
int operator+(); 
int operator-(); 
bool operator()(string s); 





}; 
+0

Postez un [MCVE] s'il vous plaît. –

+1

Avez-vous essayé de courir avec 'gdb' et de regarder la trace de la pile après les segfaults? –

+0

@TommyAndersen non, honnêtement je ne sais même pas quoi faire parce que j'ai essayé d'imprimer sur chaque ligne quelque chose pour que je puisse voir où ça casse, parfois il commence et écrit quelque chose et parfois rien –

Répondre

0

Un problème tout de suite est que vous n'êtes pas affichant des valeurs d'une fonction déclarée pour renvoyer des valeurs:

ostream&operator<<(ostream&f, Posiljka&p) 
{ 
    map<string , int>::iterator it; 
    it=p.m.begin(); 
    cout << it->second << "x" << it->first; 
    for(it=p.m.begin() ; it != p.m.end() ; ++it) 
    { 
     cout << " " << it->second << "x" << it->first; 
    } 

    // Where is the return???? 
} 

Ne pas renvoyer une valeur à partir d'une fonction déclarée pour renvoyer une valeur est undefined behavior. La fonction devrait probablement:

ostream&operator<<(ostream &f, const Posiljka &p) 
{ 
    map<string , int>::const_iterator it; 
    it=p.m.begin(); 
    f << it->second << "x" << it->first; 
    for(it=p.m.begin() ; it != p.m.end() ; ++it) 
    { 
     f << " " << it->second << "x" << it->first; 
    } 
    return f; 
} 

1) Votre flux de sortie est f, il ne devrait pas être cout.

2) Vous devriez passer Posiljka par const reference.

3) Notez maintenant que nous retournons f.

Cette fonction souffre probablement de la même question:

Posiljka&Posiljka::operator<<(string s)

Dans cette fonction, vous avez return déclarations, mais pas tous les chemins renvoient une valeur.