C++ 将适配器实现到c++;程序
我正在尝试实现适配器,它使我能够将类“TecajnaLista”与函数Statistika::prosjek一起使用。 我想要的最终结果是调用函数Statistika::prosjek,如下所示: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&
> 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);
}
}