我正在尝试实现适配器,这将使我能够使用具有Statistika :: prosjek功能的类“TecajnaLista”。 我正在寻找的最终结果是调用函数Statistika :: prosjek,如下所示:
> map<string, tuple<double, int>> pr = Statistika::prosjek(adapter);
注意到这一点:
> map<string, tuple<double, int>> pr = Statistika::prosjek(p);
没有适配器的程序如下所示:
Za_adaptaciju.h
#pragma once #include <fstream> #include <vector> #include <map> using namespace std; //============================================================================= //============================================================================= //============================================================================= namespace PostojeciProgram { class ITecaj { public: virtual void ucitaj(fstream*) = 0; virtual const vector<tuple<string, double>>* podaci() const = 0; }; class Tecaj : public ITecaj { public: void ucitaj(fstream*); const vector<tuple<string, double>>* podaci() const; private: vector<tuple<string, double>> vrijednosti; }; class Statistika { public: static map<string, tuple<double, int>> prosjek(ITecaj&); }; void ispisi(map<string, tuple<double, int>>& pr); void ispisi_tecaj(); }
Za_adaptaciju.cpp
#include <string> #include <iostream> #include "za_adaptaciju.h" //============================================================================= //============================================================================= //============================================================================= namespace PostojeciProgram { void Tecaj::ucitaj(fstream* datoteka) { string red; while (true) { *datoteka >> red; if (datoteka->eof()) { break; } else { int zarez = red.find(','); string mjesec = red.substr(0, zarez); double cijena = atof(red.substr(zarez + 1, red.size()).c_str()); vrijednosti.push_back({mjesec, cijena}); } } } const vector<tuple<string, double>>* Tecaj::podaci() const { return &vrijednosti; } map<string, tuple<double, int>> Statistika::prosjek(ITecaj& tecaj) { map<string, tuple<double, int>> prosjek; for (tuple<string, double> v : *(tecaj.podaci())) { string kljuc = get<0>(v); double nova_vrijednost = get<1>(v); tuple<double, int>& p = prosjek[kljuc]; double vrijednost = get<0>(p); int broj_pojavljivanja = get<1>(p); if (broj_pojavljivanja == 0) { prosjek[kljuc] = {nova_vrijednost, 1}; } else { prosjek[kljuc] = {vrijednost + nova_vrijednost, broj_pojavljivanja + 1}; } } return prosjek; } void ispisi(map<string, tuple<double, int>>& pr) { for (auto v : pr) { string kljuc = get<0>(v); tuple<double, int> v = pr[kljuc]; double n = get<0>(v) / get<1>(v); cout << kljuc << ": " << n << endl; } } void ispisi_tecaj() { Tecaj p; fstream f; f.open("tecaj_eur.csv", fstream::in); p.ucitaj(&f); map<string, tuple<double, int>> pr = Statistika::prosjek(p); ispisi(pr); } }
Main.cpp的
#include <iostream> #include "za_adaptaciju.h" using namespace PostojeciProgram; void test_adapter() { cout << "--- TECAJ - klasa Tecaj\n"; ispisi_tecaj(); cout << endl; } int main() { test_adapter(); }
我的尝试:
Za_adaptaciju.h
#pragma once #include <fstream> #include <vector> #include <map> using namespace std; //============================================================================= //============================================================================= //============================================================================= namespace PostojeciProgram { class ITecaj { public: virtual void ucitaj(fstream*) = 0; virtual const vector<tuple<string, double>>* podaci() const = 0; }; class Tecaj : public ITecaj { public: void ucitaj(fstream*); const vector<tuple<string, double>>* podaci() const; private: vector<tuple<string, double>> vrijednosti; }; class TecajnaLista { public: void ucitaj_valutu(string ime_datoteke); const vector<tuple<string, double>>* podaci() const; private: vector<tuple<string, double>> vrijednosti; }; /* ########################### moj adapter #################################################*/ class Adapter : public TecajnaLista { public: void ucitaj_valutu(string ime_datoteke) { stream.open("tecaj_eur.csv", fstream::in); tecaj.ucitaj(&stream); } const vector<tuple<string, double>>* podaci() const { tecaj.podaci(); return &vrijednosti; } protected: vector<tuple<string, double>> vrijednosti; PostojeciProgram::ITecaj* itecaj; PostojeciProgram::Tecaj tecaj; fstream stream; }; class Statistika { public: static map<string, tuple<double, int>> prosjek(Adapter& adapter); }; void ispisi(map<string, tuple<double, int>>& pr); void ispisi_tecaj(); }
za_adaptaciju.cpp
#include <string> #include <iostream> #include "za_adaptaciju.h" //============================================================================= //============================================================================= //============================================================================= namespace PostojeciProgram { void Tecaj::ucitaj(fstream* datoteka) { string red; while (true) { *datoteka >> red; if (datoteka->eof()) { break; } else { int zarez = red.find(','); string mjesec = red.substr(0, zarez); double cijena = atof(red.substr(zarez + 1, red.size()).c_str()); vrijednosti.push_back({mjesec, cijena}); } } } const vector<tuple<string, double>>* Tecaj::podaci() const { return &vrijednosti; } map<string, tuple<double, int>> Statistika::prosjek(Adapter& tecaj) { map<string, tuple<double, int>> prosjek; for (tuple<string, double> v : *(tecaj.podaci())) { string kljuc = get<0>(v); double nova_vrijednost = get<1>(v); tuple<double, int>& p = prosjek[kljuc]; double vrijednost = get<0>(p); int broj_pojavljivanja = get<1>(p); if (broj_pojavljivanja == 0) { prosjek[kljuc] = {nova_vrijednost, 1}; } else { prosjek[kljuc] = {vrijednost + nova_vrijednost, broj_pojavljivanja + 1}; } } return prosjek; } void ispisi(map<string, tuple<double, int>>& pr) { for (auto v : pr) { string kljuc = get<0>(v); tuple<double, int> v = pr[kljuc]; double n = get<0>(v) / get<1>(v); cout << kljuc << ": " << n << endl; } } void ispisi_tecaj() { Tecaj p; Adapter adapter; adapter.ucitaj_valutu("tecaj_eur.csv"); map<string, tuple<double, int>> pr = Statistika::prosjek(adapter); ispisi(pr); } }
程序正在编译,但我得到的是空结果,而不是预期的结果,我在没有适配器的程序中得到:
Result of program execution without adapter
提前谢谢!