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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
		std::remove(instances.begin(), instances.end(), this);
		instances.pop_back();