Cześć, mam pewne zadanie:
Napisz klasę, która będzie umiała przechowywać pary złożone z daty i liczby zmiennoprzecinkowej. Klasa ta ma być modelować funkcję, której argumentem jest obiekt typu Data, a wartością liczba (tzn. klasa ma mieć stosowną metodę -jaką najlepiej?- która wywołana z argumentem typu Data zwróci liczbę). Po skonstruowaniu obiekt tej klasy ma być pusty - nie zawierać żadnych par, ma mieć jednak możliwość dodawania kolejnych par. W przypadku dodawania pary, dla klucza której (tzn. daty) jest już przypisana jakaś wartość, nowa wartość ma zastąpić starą. Jak sygnalizować użytkownikowi, że pyta o wartość dla klucza, dla którego jeszcze wartości nie podano? Napisz funkcję testującą aby zademonstrować działanie. Nie używaj bibliotecznej klasy std::map.
Nie rozumiem pogrubionego fragmentu, na jakiej zasadzie ma to działać?
Mój kod:
main.cpp
#include <iostream>
#include "Data.hpp"
#include "KlasaMapy.hpp"
using namespace std;
int main()
{
Data a(12,11,2015);
Data c(1,1,2016);
KlasaMapy b;
b.Dodaj({1,3,2015},2.23);
b.Dodaj(c,3.23);
b.Dodaj({12,11,2015},3.23);
cout << "f("<<a<<") = " <<b.funkcja(a)<<endl;
return 0;
}
Data.hpp
#ifndef Data_hpp
#define Data_hpp
#include <iostream>
void test_Data(void);
using namespace std;
class Data
{
int dzien_;
int miesiac_;
int rok_;
public:
Data(int dzien , int miesiac , int rok);
friend ostream& operator << (ostream &output, const Data &d);
friend void test_Data(void);
friend bool operator == (const Data & a,const Data & b);
friend bool operator != (const Data & a,const Data & b);
//~Data();
};
#endif
Data.cpp
#include <iostream>
#include "Data.hpp"
#include <cassert>
#include <sstream>
using namespace std;
void poprawna_data(int dzien, int miesiac, int rok);
Data::Data(int dzien, int miesiac, int rok)
:dzien_(dzien),miesiac_(miesiac),rok_(rok)
{
poprawna_data(dzien_,miesiac_,rok_);
}
void poprawna_data(int dzien, int miesiac, int rok)
{
}
ostream& operator << (ostream &output, const Data &d)
{
output << d.dzien_<<"-"<<d.miesiac_<<"-" <<d.rok_;
return output;
}
bool operator == (const Data & a,const Data & b)
{
return (a.dzien_==b.dzien_ && a.miesiac_ == b.miesiac_ && a.rok_ == b.rok_);
}
bool operator != (const Data & a,const Data & b)
{
return (!(a==b));
}
Klasamapy.hpp
#ifndef KlasaMapy_hpp
#define KlasaMapy_hpp
#include <iostream>
#include "Data.hpp"
#include <vector>
class KlasaMapy
{
std::vector <Data> argumenty_;
std::vector <double> wyniki_;
public:
void Dodaj(Data d, double liczba);
double funkcja(Data d);
};
#endif
Klasamapy.cpp
#include <iostream>
#include <cassert>
#include <algorithm>
#include "KlasaMapy.hpp"
double KlasaMapy::funkcja(Data d)
{
if(argumenty_.size()==0)
{
cerr << "brak argumentow!";
exit(0);
}
int rozmiar;
for(rozmiar = 0; rozmiar < argumenty_.size(); rozmiar++)
{
if(d == argumenty_[rozmiar])
break;
}
if(rozmiar == argumenty_.size() && argumenty_[argumenty_.size()-1] != d)
{
cerr <<"brak wyniku dla tego argumentu!\n";
exit(0);
}
return wyniki_[rozmiar];
}
void KlasaMapy::Dodaj(Data d, double liczba)
{
argumenty_.push_back(d);
wyniki_.push_back(liczba);
}