2016-06-19 18 views
1

私はクラス割り当てのためのコードを書いていますが、g ++コマンドでターミナルに置いたとき、それは私にセグメンテーションフォールトを与えます。コードは大きく、最初の部分は、マップの要素を挿入すると動作します(コマンドを書き込んだ後に壊れてしまいます)。その後、キャストする必要があります(これはRedefinition演算子による割り当てです)。誰かが私を助けてください。セグメンテーションフォールト(コアダンプ)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; 
} 

私のメイン:

#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; 
} 

私インタフェース:すぐに

#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

投稿する[MCVE]してください。 –

+1

'gdb'で実行してみましたが、segfaultsの後にスタックトレースを調べましたか? –

+0

@TommyAndersenいいえ、私は正直なところ、すべての行の印刷を試したので何をすべきかわからなくても、どこで折れているか分かります。時には何かが始まって何かが書き込まれることがあります。 –

答えて

0

一つの問題は、あなたが値を返すように宣言された関数から値を返すされていないということです。

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???? 
} 

値を返さない値を返すと宣言された関数からは、未定義の振舞いです。この関数は、おそらく次のようになります。

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)あなたの出力ストリームは、それがcoutすべきではない、fです。

2)Posiljkaをconst referenceで渡す必要があります。

3)今度はfに戻ります。あなたがreturn文を持っている、その関数で

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

ではなく、すべてのパスが値を返す:

この関数は、おそらく同じ問題に苦しんでいます。

関連する問題