lang:cpp:smartptr
Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
lang:cpp:smartptr [2019/10/17 08:45] – Création avec "std::weak_ptr en tant que clé dans un conteneur" root | lang:cpp:smartptr [2024/01/11 17:00] (Version actuelle) – Ajout de "Différencier empty et expired" root | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | {{ : | ||
+ | |||
+ | ====Durée de vie==== | ||
+ | |||
+ | Lors d'un '' | ||
+ | |||
+ | <code cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | class A { | ||
+ | | ||
+ | A() { std::cout << " | ||
+ | ~A() { std::cout << " | ||
+ | }; | ||
+ | |||
+ | int main() { | ||
+ | std:: | ||
+ | a.reset(new A()); | ||
+ | a = std:: | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Sortie : | ||
+ | |||
+ | < | ||
+ | Constructor | ||
+ | Constructor | ||
+ | Destructor | ||
+ | Constructor | ||
+ | Destructor | ||
+ | Destructor | ||
+ | </ | ||
+ | |||
+ | ====Préserver l' | ||
+ | Il faut utiliser '' | ||
+ | |||
+ | Il existe aussi '' | ||
+ | |||
+ | Soit la classe commune '' | ||
+ | |||
+ | <code cpp> | ||
+ | struct X | ||
+ | { | ||
+ | void g() const { std::cout << "g (const)\n"; | ||
+ | void g() { std::cout << "g (non-const)\n"; | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | et le programme commun : | ||
+ | |||
+ | <code cpp> | ||
+ | int main() | ||
+ | { | ||
+ | Y y; | ||
+ | y.f(); | ||
+ | |||
+ | const Y cy; | ||
+ | cy.f(); | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | * Cas avec la classe '' | ||
+ | |||
+ | <code cpp> | ||
+ | struct Y | ||
+ | { | ||
+ | Y() { } | ||
+ | |||
+ | void f() const | ||
+ | { | ||
+ | std::cout << "f (const)\n"; | ||
+ | m_ptrX.g(); | ||
+ | } | ||
+ | |||
+ | void f() | ||
+ | { | ||
+ | std::cout << "f (non-const)\n"; | ||
+ | m_ptrX.g(); | ||
+ | } | ||
+ | |||
+ | // Ici, X est une instance sans pointeur. | ||
+ | X m_ptrX; | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | Rendu sans surprise : | ||
+ | |||
+ | < | ||
+ | f (non-const) | ||
+ | g (non-const) | ||
+ | f (const) | ||
+ | g (const) | ||
+ | </ | ||
+ | |||
+ | Si la méthode '' | ||
+ | |||
+ | * Cas avec un pointeur intelligent | ||
+ | |||
+ | <code cpp> | ||
+ | struct Y | ||
+ | { | ||
+ | Y() : m_ptrX{} { } | ||
+ | |||
+ | void f() const | ||
+ | { | ||
+ | std::cout << "f (const)\n"; | ||
+ | m_ptrX-> | ||
+ | } | ||
+ | |||
+ | void f() | ||
+ | { | ||
+ | std::cout << "f (non-const)\n"; | ||
+ | m_ptrX-> | ||
+ | } | ||
+ | |||
+ | std:: | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | Rendu : | ||
+ | |||
+ | <code cpp> | ||
+ | f (non-const) | ||
+ | g (non-const) | ||
+ | f (const) | ||
+ | g (non-const) | ||
+ | </ | ||
+ | |||
+ | On ne respecte l' | ||
+ | |||
+ | * Cas avec un pointeur unique et propagate_const | ||
+ | |||
+ | Prérequis : minimum clang 3.9, gcc 6.1. Pas dans Visual Studio 2017 [[https:// | ||
+ | |||
+ | <code cpp> | ||
+ | #include < | ||
+ | std:: | ||
+ | </ | ||
+ | |||
+ | Rendu : | ||
+ | |||
+ | < | ||
+ | f (non-const) | ||
+ | g (non-const) | ||
+ | f (const) | ||
+ | g (const) | ||
+ | </ | ||
+ | |||
+ | ====Encapsuler fopen/ | ||
+ | |||
+ | <code cpp> | ||
+ | std:: | ||
+ | </ | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | ====weak_ptr==== | ||
+ | |||
====std:: | ====std:: | ||
Il faut utiliser le comparateur '' | Il faut utiliser le comparateur '' | ||
Ligne 5: | Ligne 165: | ||
</ | </ | ||
+ | ===Différencier empty et expired=== | ||
+ | Sans passer par '' | ||
+ | |||
+ | <code cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | class A {}; | ||
+ | |||
+ | int main() { | ||
+ | { | ||
+ | std:: | ||
+ | |||
+ | if (!aa.owner_before(std:: | ||
+ | std::cout << " | ||
+ | } | ||
+ | if (aa.expired()) { | ||
+ | std::cout << " | ||
+ | } | ||
+ | } | ||
+ | |||
+ | { | ||
+ | std:: | ||
+ | std:: | ||
+ | |||
+ | if (!aa.owner_before(std:: | ||
+ | std::cout << " | ||
+ | } | ||
+ | if (aa.expired()) { | ||
+ | std::cout << " | ||
+ | } | ||
+ | } | ||
+ | |||
+ | { | ||
+ | std:: | ||
+ | { | ||
+ | std:: | ||
+ | aa = a; | ||
+ | |||
+ | if (!aa.owner_before(std:: | ||
+ | std::cout << " | ||
+ | } | ||
+ | if (aa.expired()) { | ||
+ | std::cout << " | ||
+ | } | ||
+ | } | ||
+ | if (!aa.owner_before(std:: | ||
+ | std::cout << " | ||
+ | } | ||
+ | if (aa.expired()) { | ||
+ | std::cout << " | ||
+ | } | ||
+ | } | ||
+ | return 0; | ||
+ | } | ||
+ | </ |
lang/cpp/smartptr.1571294723.txt.gz · Dernière modification : 2019/10/17 08:45 de root