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 ?