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
| struct B {
int cpt;
std::string name;
B(std::string _name) { cpt = 1; name = _name; }
};
struct BFactory
{
B* getB(std::string name) {
std::map<std::string, B*>::iterator it = mapB.find(name);
if (it != mapB.end())
{
// B existe déjà, on incrémente le compteur et on le retourne
it->second->cpt++;
return it->second;
}
// not found, create it
B* r = new B(name);
mapB[name] = r;
return r;
}
void releaseB(B* b) {
b->cpt--;
if (b->cpt == 0)
{
// le compteur vaut 0, il s'agissait du dernier B référencé dans notre programme
std::map<std::string, B*>::iterator it = mapB.find(b->name);
mapB.erase(it);
}
}
std::map<std::string, B*> mapB;
}; |