Outils pour utilisateurs

Outils du site


helloworld:design_pattern:observer

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
helloworld:design_pattern:observer [2022/10/07 09:50] – Fusion avec le code Java roothelloworld:design_pattern:observer [2022/10/07 09:58] (Version actuelle) – Ajout d'un exemple en C++ root
Ligne 67: Ligne 67:
 } }
 </file> </file>
 +
 +====C++====
 +
 +===Liste avec shared_ptr===
 +
 +<code cpp>
 +#include <algorithm>
 +#include <iostream>
 +#include <memory>
 +#include <vector>
 +
 +class Observer {
 +   public:
 +    ~Observer() { std::cout << "~Observer\n"; }
 +    void call() { std::cout << "Call\n"; }
 +};
 +
 +class Observable {
 +   public:
 +    std::vector<std::weak_ptr<Observer>> listener;
 +    void call() {
 +        listener.erase(std::remove_if(listener.begin(), listener.end(),
 +                                      [](std::weak_ptr<Observer> obs) -> bool {
 +                                          auto ob = obs.lock();
 +                                          if (ob) {
 +                                              ob->call();
 +                                              return false;
 +                                          } else {
 +                                              std::cout << "Fails\n";
 +                                              return true;
 +                                          }
 +                                      }),
 +                       listener.end());
 +    }
 +};
 +
 +int main() {
 +    auto observer = std::make_shared<Observer>();
 +    Observable observable;
 +    observable.listener.push_back(observer);
 +    observable.call();
 +    observer = nullptr;
 +    observable.call();
 +    std::cout << "END\n";
 +}
 +</code>
 +
 +Résultat:
 +
 +<code>
 +Call
 +~Observer
 +Fails
 +END
 +</code>
  
helloworld/design_pattern/observer.1665129050.txt.gz · Dernière modification : de root