Déjà dans ton 2eme cas ton compilo devrait t'avertir que tu prend l'adresse d'un objet temporaire qui ne sera plus valide dès la fin de l'instruction.
Pour éviter ce genre de problème, on pourrait dans setStrategy effectuer une copie de la stratégie via Prototypage (cela revient à dire que le widget est le gestionaire de la stratégie) . Par contre on à une gaspile de mémoire si on continue à passer l'objet en paramètre via pointeur car on ne sait pas comment il à été alloué. Pour éviter cela, il faudrat le passer en référénce constante puis le cloner.
Ca donnerai un truc du genre :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
class Widget
{
public:
Widget() : s_(0) {}
~Widget() { delete s_; s_ = 0; }
void execute()
{
s_.apply();
}
void setStrategy(const Strategy& s)
{
s_ = s.Clone();
}
private:
Strategy* s_;
} |
Et quelque chose comme :
widget.setStrategy(Strategy())
passerai sans problème.
EDIT: code non testé.
Partager