Bonjour à tous,
J'ai une classe conteneur directory et une classe directory_item (dont va dériver la classe directory et une classe file). Un objet directory contient une liste de directory_item (via des shared_ptr), et directory_item connaît son répertoire parent (via un weak_ptr).
La classe directory comporte une fonction membre add(directory_item) qui, en plus d'alimenter la liste de directory_item, a la responsabilité d'informer l'objet directory_item en question qui est son répertoire parent (via directory_item::parent()). Cela donne une double responsabilité, c'est peut-être là que ça péche ?
Attention c'est (un peu) C++0x :
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 class directory_item; class directory: public directory_item { public: void add(std::shared_ptr<directory_item> an_item); private: std::list<std::shared_ptr<directory_item>> m_items; }; class directory_item { public: void parent(std::weak_ptr<directory> parent_directory); private: std::weak_ptr<directory> m_parent_directory; };La ligne qui me pose problème est en rouge.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 void directory::add(std::shared_ptr<directory_item> an_item) { m_items.push_back(an_item); an_item->parent(???); //que mettre ici ? } void directory_item::parent(std::weak_ptr<directory> parent_directory) { m_parent_directory = parent_directory; }
En premier, j'ai essayé this qui évidemment ne compile pas.
Ensuite, j'ai utilisé std::shared_from_this(), mais il semblerait que le weak_ptr directory_item::m_parent_directory devienne immédiatement invalide juste après son affectation. Le compteur de référence du shared_ptr résultant de std::shared_from_this() doit tomber à zéro… pourtant le directory n'est pas détruit (peut-être que le deleter du shared_ptr est sans effet ? http://www.boost.org/doc/libs/1_36_0...es.html#static).
Quoi qu'il en soit, il semblerait que le weak_ptr à passer en paramètre à directory_item::parent(directory) doive être créé à partir d'un shared_ptr persistant.
Dans ce cas, la seule solution qui me reste serait de créer une fonction libre ayant la signature ci-dessus, que l'objet directory pourra appeler pour obtenir un shared_ptr persistant sur lui-même à partir de *this :
Est-ce que ma façon de penser est correcte ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 std::shared_ptr<directory> find_directory(filesystem&, const directory&);
Si oui, est-ce que la solution que je donne est la bonne ?
Partager