将适配器实现到c ++程序中

时间:2016-11-21 16:20:36

标签: c++

我正在尝试实现适配器,这将使我能够使用具有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

提前谢谢!

0 个答案:

没有答案