【问题标题】:c++ has stopped working static map functionc++已经停止工作静态地图功能
【发布时间】:2018-05-27 14:39:26
【问题描述】:

我创建了两个类:package 和 tourpackage,它们继承了 package 类。旅游包类包含目的地向量。我创建了一个包向量,现在我希望向量中的每个目标都显示出现次数。我创建了一个静态地图和一个返回地图的静态函数,因此我可以从主函数访问它。但是当我尝试显示地图时,程序会显示但随后说它已停止工作。如果我将地图公开,那么它可以工作,但我希望它是私有的

TourPackage.h:

#ifndef TourPackage_H
#define TourPackage_H
#include "Package.h"
#include <vector>
#include <string>
#include <iostream>
#include <map>
using namespace std;
class TourPackage: public Package
{vector <string> destinations;
int lenght;
static map <string, int> frequency;
    public:

        TourPackage(double, int lenght);
        virtual ~TourPackage();

    static map <string, int> frequencies ()
    {
        return frequency;
    }

    protected:

    private:
};

#endif

TourPackage.cpp:

#include "TourPackage.h"
TourPackage::TourPackage(double price,int n):Package (price)

    {
    string aux;
    int max1=0;
        lenght=n;
        string x;
        for (int i=0;i<lenght;i++)
        {getline (cin, x);
        destinations.push_back(x);

        ++frequency[destinations[i]];}



    }

    TourPackage::~TourPackage()
    {
        //dtor
    }

main.cpp

#include <iostream>
#include <vector>
#include <string>
#include "TourPackage.h"
#include <typeinfo>
#include <map>
#include <utility>
#include <algorithm>

using namespace std;
map <string, int> TourPackage::frequency;
bool comp (const pair <string, int> &l, const pair <string, int> &r)
{
    if (l.second!=r.second)
        return l.second>r.second;
    return l.first>r.first;
}
int main()
{TourPackage p(2,4);

vector <Package*> Packages;
    Packages.push_back (new Package (1000));
    Packages.push_back (new Package (4234));
    Packages.push_back (new TourPackage (32,3));
    Packages.push_back (new TourPackage (234, 4));
    Packages.push_back(new TourPackage (43, 5));

for (map <string, int>::const_iterator is=TourPackage::frequencies().begin(); is!=TourPackage::frequencies().end();is++)
    cout<<is->first<<" "<<is->second<<" ";
cout<<endl;





cout<<endl;
return 0;

}

【问题讨论】:

    标签: c++ class dictionary inheritance


    【解决方案1】:

    您已经声明了frequencies 函数,例如:

    static map <string, int> frequencies ()
    

    也就是说,它按值返回地图

    这意味着

    is=TourPackage::frequencies().begin();
    

    is!=TourPackage::frequencies().end()
    

    每次调用都返回不同的对象。来自不同映射的迭代器不能相互比较,尝试这样做会导致undefined behavior

    更改frequencies 函数以返回一个引用

    static map <string, int>& frequencies ()
    //                      ^
    //  Returning a reference
    

    【讨论】:

    • 也许返回值也需要是const?取决于是否可以作为外部用户更改地图。
    猜你喜欢
    • 1970-01-01
    • 2021-10-16
    • 2012-10-07
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多