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