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;
};
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;
}
La ligne qui me pose probl�me est en rouge.
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 :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
 
std::shared_ptr<directory> find_directory(filesystem&, const directory&);
Est-ce que ma fa�on de penser est correcte ?
Si oui, est-ce que la solution que je donne est la bonne ?