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 :
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 !
EDIT : je rends compte que l'effacement d'un seul élément se fait très bien comme ça :
1 2
| std::remove(instances.begin(), instances.end(), this);
instances.pop_back(); |
Partager