私はクラス割り当てのためのコードを書いていますが、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);
};
投稿する[MCVE]してください。 –
'gdb'で実行してみましたが、segfaultsの後にスタックトレースを調べましたか? –
@TommyAndersenいいえ、私は正直なところ、すべての行の印刷を試したので何をすべきかわからなくても、どこで折れているか分かります。時には何かが始まって何かが書き込まれることがあります。 –