1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| #include <sstream>
#include <string>
#include <string>
#include <cstdlib>
#include <iostream>
class SemanticA {}; // L'interface métier
struct Unit {
virtual void fill(std::istream& data_input) = 0;
protected:
std::string next(std::istream& input) const {
std::string result;
std::getline(input,result,';');
return result;
}
};
struct A : public Unit {
int a_;
A() : a_(0) {}
virtual void fill(std::istream& data_input) { a_ = ::atoi(next(data_input).c_str()); }
};
struct B : public Unit {
int b_;
B() : b_(0) {}
virtual void fill(std::istream& data_input) { b_ = ::atoi(next(data_input).c_str()); }
};
struct C : public Unit {
int c1_;
int c2_;
C() : c1_(0), c2_(0) {}
virtual void fill(std::istream& data_input) {
c1_ = ::atoi(next(data_input).c_str());
c2_ = ::atoi(next(data_input).c_str());
}
};
struct Record {
A* sa_;
B* sb_;
C* sc_;
Record(A* ia=0, B* ib=0, C* ic=0) : sa_(ia), sb_(ib), sc_(ic) {}
virtual ~Record() {
delete sa_;
delete sb_;
delete sc_;
}
void fill(std::istream& input) {
if(sa_) sa_->fill(input);
if(sb_) sb_->fill(input);
if(sc_) sc_->fill(input);
}
void display() const {
if(sa_) std::cout << "A::a_ == " << sa_->a_ << "\n";
if(sb_) std::cout << "B::b_ == " << sb_->b_ << "\n";
if(sc_) {
std::cout << "C::c1_ == " << sc_->c1_ << "\n";
std::cout << "C::c2_ == " << sc_->c2_ << "\n";
}
std::cout << std::endl;
}
// A toi de voir de quelle interface publique tu as besoin
// Pour moi, record doit te fournir des méthodes de constructions d'objets
// polymorphes en fonction des datas qu'il a récupérées
SemanticA* BuildApplicationObject(); // A implémenter
};
int main() {
std::istringstream data_a("1;");
std::istringstream data_ab("1;2;");
std::istringstream data_ac("1;3;4;");
std::istringstream data_abc("1;2;3;4;");
Record ra(new A);
Record rab(new A, new B);
Record rac(new A, 0, new C);
Record rabc(new A, new B, new C);
ra.fill(data_a);
rab.fill(data_ab);
rac.fill(data_ac);
rabc.fill(data_abc);
ra.display();
rab.display();
rac.display();
rabc.display();
return 0;
} |
Partager