Lister toutes les instances d'une classe
Bonjour,
Pour une raison que vous ne préférez pas connaitre, j'aimerais garder une liste de toutes les instances d'une classe. J'ai écrit un code comme ceci :
Code:
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
| #include <algorithm>
#include <iostream>
#include <vector>
struct Foo {
static std::vector<Foo*> instances;
static void list() {
std::cout << "---" << std::endl;
for (auto& foo : instances) {
std::cout << foo->name << std::endl;
}
std::cout << "---" << std::endl;
}
Foo(std::string name) :
name(name) {
instances.push_back(this);
}
Foo(const Foo&) = delete;
Foo& operator=(const Foo&) = delete;
~Foo() {
auto endIt = std::remove(instances.begin(), instances.end(), this);
instances.erase(endIt, instances.end());
}
std::string name;
};
std::vector<Foo*> Foo::instances;
int main(void) {
{
Foo a { "a " }, b { "b" }, c { "c" };
Foo::list();
{
Foo d("d");
Foo::list();
}
Foo::list();
}
Foo::list();
} |
Il affiche :
---
a
b
c
---
---
a
b
c
d
---
---
a
b
c
---
---
---
- Quels commentaires pourriez-vous faire sur ce code ? Il n'est pas thread-safe mais ce n'est pas un problème ici.
- Quels conteneurs auraient été mieux ?
- Ma technique de suppression d'un élément du vector est-elle correcte ?
Merci d'avance ! :ccool:
EDIT : je rends compte que l'effacement d'un seul élément se fait très bien comme ça :
Code:
1 2
| std::remove(instances.begin(), instances.end(), this);
instances.pop_back(); |