Bonjour,
J'essaie de créer une classe générale de gestion de ressources et je souhaite comprendre la sémantique move.
Voici la partie de code nécessaire à la compréhension de la classe :
Ma question est :
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
46
47
48
49
50
51
52 template <typename T, template <typename ElementType, typename... others> class Cont> class Ressource; template <typename T> class Ressource<T, std::vector> { private : std::vector<T*> v; public : struct Identifier { friend class Ressource; private : const Ressource& r; unsigned pos; public : Identifier(const Ressource& pr, unsigned p) : r(pr), pos(p) {} T& getObject() { if(r.v[pos]!=NULL) return *r.v[pos]; else throw std::runtime_error("Accessing deleted Object"); } const T& getObject() const { if(r.v[pos]!=NULL) return *r.v[pos]; else throw std::runtime_error("Accessing deleted Object"); } }; Ressource() = default; Ressource(const Ressource&) = delete; Ressource& operator=(const Ressource&) = delete; ~Ressource() { for(auto it = v.begin(); it!=v.end();it++) if(*it!=NULL) delete *it; } Identifier addObject(const T& obj) { v.push_back(new T(obj)); return Identifier(*this, v.size()-1); } void deleteObject(const Identifier& i) { delete v[i.pos]; v[i.pos] = NULL; } };
Que dois-je rajouter pour que lorsque l'utilisateur fait ressource.addObject(T(parametres...)), je rajoute l'adresse de l'objet temporaire créé et je dis au compilateur de ne pas le supprimer ? Note : un delete sera par la suite effectué sur cet objet.
Je pense bouger le constructeur de Identifier en privé et mettre un constructeur de copie en public et créer une classe d'exception spécifique.
Je vais aussi rajouter des itérators pour pouvoir itérer sur la collection sans garantir l'ordre de parcours.
Peut-être que je devrais spécialiser en fonction de l'existence d'un randomaccessiterator plutôt que de directement spécialiser sur vector (dans le futur list, ...) ?
Peut-être que je devrais créer une classe Const_Identifer avec Identifer convertible en Const_Identifer parce que aujourd'hui const Identifer joue ce role mais cela ne semble pas parfait... Est-ce possible sans pertes de performance lors de la convertion ?
Si jamais vous avez d'autres remarques, n'hésitez pas !
Merci d'avance !
Partager