C++ 将适配器实现到c++;程序

C++ 将适配器实现到c++;程序,c++,C++,我正在尝试实现适配器,它使我能够将类“TecajnaLista”与函数Statistika::prosjek一起使用。 我想要的最终结果是调用函数Statistika::prosjek,如下所示: > map<string, tuple<double, int>> pr = Statistika::prosjek(adapter); map pr=Statistika::prosjek(适配器); 除此之外: > map<string, tuple&

我正在尝试实现适配器,它使我能够将类“TecajnaLista”与函数Statistika::prosjek一起使用。 我想要的最终结果是调用函数Statistika::prosjek,如下所示:

> map<string, tuple<double, int>> pr = Statistika::prosjek(adapter);
map pr=Statistika::prosjek(适配器); 除此之外:

> map<string, tuple<double, int>> pr = Statistika::prosjek(p);
>map pr=Statistika::prosjek(p);
没有适配器的程序如下所示:

zau adaptaciju.h

#pragma一次
#包括
#包括
#包括
使用名称空间std;
//=============================================================================
//=============================================================================
//=============================================================================
命名空间后置程序{
ITecaj类{
公众:
虚空ucitaj(fstream*)=0;
虚拟常量向量*podaci()常量=0;
};
Tecaj类:公共ITecaj{
公众:
void ucitaj(fstream*);
常量向量*podaci()常量;
私人:
矢量vrijednosti;
};
统计类{
公众:
静态地图程序(ITecaj&);
};
无效ispisi(地图和公关);
无效ispisi_tecaj();
}
zau adaptaciju.cpp

#包括
#包括
#包括“za_Adaptiaciju.h”
//=============================================================================
//=============================================================================
//=============================================================================
命名空间后置程序{
void Tecaj::ucitaj(fstream*datoteka){
串红;
while(true){
*达托特卡>>红色;
如果(datoteka->eof()){
打破
}否则{
int zarez=red.find(',');
字符串mjesec=red.substr(0,zarez);
double-cijena=atof(red.substr(zarez+1,red.size()).c_str());
vrijednosti.推回({mjesec,cijena});
}
}
}
常量向量*Tecaj::podaci()常量{
return&vrijednosti;
}
地图统计:prosjek(ITecaj和tecaj){
普罗舍克地图;
对于(元组v:*(tecaj.podaci())){
字符串kljuc=get(v);
双新星=get(v);
tuple&p=prosjek[kljuc];
双vrijednost=get(p);
int broj_pojavljivanja=get(p);
if(broj_pojavljivanja==0){
prosjek[kljuc]={nova_vrijednost,1};
}否则{
prosjek[kljuc]={vrijednost+nova_vrijednost,broj_pojavljivanja+1};
}
}
返回prosjek;
}
无效ispisi(地图和请购单){
用于(自动v:pr){
字符串kljuc=get(v);
元组v=pr[kljuc];
双n=get(v)/get(v);

如果适配器用自己的函数和数据替换了TecajnaLista的所有函数和数据,甚至从未查看过TecajnaLista的数据或函数,那么为什么适配器是从TecajnaLista派生出来的呢?我不清楚是什么适应了什么。这更像是一个模拟测试吗?Profesor对他的请求非常不清楚……我设法用return tecaj.podaci()修复了程序.不知道这是否是他所寻找的。我想我必须找出答案。谢谢你!为什么适配器是从TecajnaLista派生出来的,如果它用自己的函数和数据替换了TecajnaLista的所有函数和数据,甚至从来没有看过TecajnaLista的数据或函数?我不清楚什么被改编成什么。这更像是一个测试模拟吗?教授esor对他的请求非常不清楚…我设法用return tecaj.podaci();;修复了程序。不知道这是否是他要找的。我想我必须找到答案。谢谢你的时间!
#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();
}
#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);
  }
}
#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();
}
#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();

}
#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);
  }
}