Bonjour, je m'initie aux pointeurs intelligents et mon programme crash.
Voici un code minimaliste de ce que j'essaie de faire:
Ainsi, j'entre en argument dans le constructeur le parent de mon objet, ce qui permet à mon objet de connaître son prédécesseur et de s'enregistrer vis-a-vis de celui-ci comme son suivant.
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 #include <boost/shared_ptr.hpp> #include <boost/enable_shared_from_this.hpp> class Line: public boost::enable_shared_from_this<Line> { public: typedef boost::weak_ptr<Line> Weak_Line; typedef boost::shared_ptr<Line> Shared_Line; Weak_Line _parent; Shared_Line _child; Line(Weak_Line parent = Weak_Line()) { Shared_Line p = parent.lock(); _parent = parent; p->_child = this->shared_from_this(); } }; int main(int argc, char *argv[]) { Line::Shared_Line l1(new Line()); Line::Shared_Line l2(new Line(l1)); Line::Shared_Line l3(new Line(l2)); return 1; }
Aussi, je sais d'où vient le problème: "this->shared_from_this()" ne supporte pas le fait d'êtrer appellé alors que aucun pointeur shared, n'a encore été créé.
L'une des solution que j'ai trouvé sur le net est de créer l'objet, puis de l'initialiser. Et à la rigueur, créer une fonction statique qui permet de créer l'objet comme je le souhaite.
Néanmoins, je souhaiterais faire en sorte que l"initialisation se passe dans le constructeur, est ce quand même possible?
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 class Line: public boost::enable_shared_from_this<Line> { public: typedef boost::weak_ptr<Line> Weak_Line; typedef boost::shared_ptr<Line> Shared_Line; Weak_Line _parent; Shared_Line _child; Line() { } void init(Weak_Line parent = Weak_Line()) { Shared_Line p = parent.lock(); _parent = parent; if(p) p->_child = this->shared_from_this(); } static Shared_Line create(Weak_Line parent = Weak_Line()) { Shared_Line line(new Line()); line->init(parent); return line; } }; int main(int argc, char *argv[]) { Line::Shared_Line l1(new Line()); l1->init(); Line::Shared_Line l2(new Line()); l2->init(l1); Line::Shared_Line l3 = Line::create(l2); return 1; }
Sinon, dans mon cas de la fonction 'create", mes objets pouraient heriter de Line. Ce qui fait que ma fonction 'create' n'est pas suffisante en temps que telle et je vais devoir réimplémenté la fonction 'create' pour chaque nouvelle classe comme suit:
A la rigueur, il serait possible de faire un template de la méthode, mais je trouve que la syntaxe resterait lourde: Shared_BlueLine bl = BlueLine::create<BlueLine>(parent). Serait il possible de remédier à cela?
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 class RedLine: public Line { public: typedef boost::weak_ptr<Line> Weak_RedLine; typedef boost::shared_ptr<Line> Shared_RedLine; RedLine() {} static Shared_RedLine create(Weak_RedLine parent = Weak_Line()) { Shared_RedLine line(new Line()); line->init(parent); return line; } };
Au final, je pense que le coup du create n'est pas une bonne idée et donc que la seule le constructeur vide suivit de la méthode d'initialisation est viable.
Je souhaiterais avoir vos avis et suggestions,
merci d'avance
Partager