C++ 分段故障(堆芯转储)c++;

C++ 分段故障(堆芯转储)c++;,c++,segmentation-fault,operators,coredump,redefine,C++,Segmentation Fault,Operators,Coredump,Redefine,我一直在为我的类分配编写代码,当我用g++命令在终端中对其进行修改时,它给了我分段错误。代码很大,但第一部分,当我插入map元素时,它工作(因为一旦它编写了命令,然后被压碎),然后当它必须强制转换(这是带有重新定义操作符的赋值)时,它崩溃。有人能帮帮我吗 #include <iostream> #include <map> #include <algorithm> #include <string> #include <typeinfo>

我一直在为我的类分配编写代码,当我用g++命令在终端中对其进行修改时,它给了我分段错误。代码很大,但第一部分,当我插入map元素时,它工作(因为一旦它编写了命令,然后被压碎),然后当它必须强制转换(这是带有重新定义操作符的赋值)时,它崩溃。有人能帮帮我吗

#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;
}
#包括
#包括
#包括
#包括
#包括
#包括“druga_verzija.h”
使用名称空间std;
//建造师
Posiljka::Posiljka(){
m、 清除();
}
//如何打印我的地图
ostream&operatorfirst]=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;
其他的
novi.m[it->first]=it->second;
}
返回novi;
}
//将map与int相乘,生成新的map
Posiljka Posiljka::运算符*(int x){
对它进行迭代器;
波西利卡·诺维;
for(it=m.begin();it!=m.end();+it)
novi.m[it->first]=it->second*x;
返回novi;
}
//写下地图上有多少对象
Posiljka::运算符int(){
int-suma=0;
对它进行迭代器;
for(it=m.begin();it!=m.end();+it)
suma=suma+it->second;
返回(int)suma;
}
//写一个对象的mak
int Posiljka::运算符+(){
int-maks=0;
对它进行迭代器;
for(it=m.begin();it!=m.end();+it)
如果(it->second>maks)
maks=it->second;
返回maks;
}
//写入一个对象的最小值
int Posiljka::运算符-(){
如果(m.begin()->秒)
返回0;
int mini=m.begin()->秒;
对它进行迭代器;
for(it=m.begin();it!=m.end();+it)
如果(它->秒<小)
迷你=它->秒;
返回迷你;
}
//如果在thios映射中有对象s
bool Posiljka::operator()(字符串s){
如果(m[s])
返回true;
其他的
返回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;
}
#包括
#包括“druga_verzija.h”
使用名称空间std;
int main()
{
Posiljka P,Q,R;

P

一个问题是,您没有从声明为返回值的函数返回值:

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&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&operatorPost a请问。你试过用
gdb运行并在它出错后查看堆栈跟踪吗?@TommyAndersen不,我真的不知道该怎么做,因为我试着在每一行打印一些东西,以便我能看到它在哪里断开,有时它开始写一些东西,有时我甚至不知道该怎么做nothing@PetraKos我会通过
gdb
运行代码,一旦出现故障,通过运行命令
bt
@TommyAndersen查看回溯。非常感谢。发现错误只是不知道如何修复。哈哈,当我有这样的代码时:请不要发布。你试过使用
gdb
运行并查看堆栈跟踪吗Segfults?@TommyAndersen不,我真的不知道该怎么办,因为我试着在每一行上打印一些东西,这样我就可以看到它在哪里断了,有时它开始写一些东西,有时nothing@PetraKos我会尝试通过
gdb
运行代码,一旦出现故障,通过运行命令
bt
.@TommyAndersen非常感谢。发现了一个错误,但不知道如何修复。哈哈,当我有这样的代码时:cout
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;
}