shared_ptr et dependance cyclique
Bonjour à tous et merci d'avance pour votre aide :)
J'ai un problème dans mon code, car j'ai besoin de d'avoir deux classe qui se contienne l'une l'autre sous forme de shared_ptr. J'ai essayer d'utiliser un weak_ptr pour casser la dépendance, mais je le fais mal, le programme crash quand je le créer.
Je suis en train de faire un pattern state, d'ou la dépendance.
Voici mon code.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #ifndef CCLIENT_H_INCLUDED
#define CCLIENT_H_INCLUDED
#include <memory>
#include "etat.h"
class client
{
private:
std::shared_ptr<etat> etat1_;
std::shared_ptr<etat> etat2_;
std::shared_ptr<etat> etatCourant_;
public:
client();
void action();
void setEtatCourant(std::shared_ptr<etat> etat);
std::shared_ptr<etat> getEtat1();
std::shared_ptr<etat> getEtat2();
};
#endif // CCLIENT_H_INCLUDED |
Code:
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
| #include "client.h"
#include "etat.h"
client::client() : etat1_(new etat(this)), etat2_(new etat(this))
{
etatCourant_ = etat1_;
}
void client::action()
{
etatCourant_->action();
}
void client::setEtatCourant(std::shared_ptr<etat> etat)
{
etatCourant_ = etat;
}
std::shared_ptr<etat> client::getEtat1()
{
return etat1_;
}
std::shared_ptr<etat> client::getEtat2()
{
return etat2_;
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #ifndef CETAT_H_INCLUDED
#define CETAT_H_INCLUDED
#include <memory>
class client;
class etat
{
private:
std::weak_ptr<client> client_;
public:
etat(client* c);
void action();
};
#endif // CETAT_H_INCLUDED |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include "client.h"
#include "etat.h"
#include <iostream>
etat::etat(client* c) : client_ (std::shared_ptr<client>(c))
{
}
void etat::action()
{
client_.lock()->setEtatCourant(client_.lock()->getEtat2());
client_.reset();
} |