lang:cpp:smartptr
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
lang:cpp:smartptr [2019/10/17 09:13] – Ajout de "Préserver l'attribut const sur les pointeurs" root | lang:cpp:smartptr [2025/07/06 16:33] (Version actuelle) – [Préserver l'attribut const sur les pointeurs] : déplacement dans un article dédié root | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====std::weak_ptr en tant que clé dans un conteneur==== | + | {{ :lang:cpp:smartptr:cpp_smart_pointers_ebook.pdf |C++ smart pointers fluentcpp}} |
- | Il faut utiliser le comparateur '' | + | |
- | < | + | |
- | std::map<U, T, std:: | + | |
- | </ | + | |
- | ====Préserver l' | + | ====Durée de vie==== |
- | Il faut utiliser '' | + | |
+ | Lors d'un '' | ||
- | Soit la classe commune '' | + | <code cpp> |
+ | #include < | ||
+ | #include < | ||
- | <code cpp> | + | class A { |
- | struct X | + | public: |
- | { | + | |
- | | + | |
- | | + | |
}; | }; | ||
- | </ | ||
- | et le programme commun : | + | int main() { |
- | + | | |
- | <code cpp> | + | |
- | int main() | + | |
- | { | + | |
- | | + | |
- | | + | |
- | + | ||
- | | + | |
- | cy.f(); | + | |
} | } | ||
- | |||
</ | </ | ||
- | ===Cas avec la classe '' | + | Sortie : |
- | < | + | < |
- | struct Y | + | Constructor |
- | { | + | Constructor |
- | Y() { } | + | Destructor |
+ | Constructor | ||
+ | Destructor | ||
+ | Destructor | ||
+ | </ | ||
- | void f() const | ||
- | { | ||
- | std::cout << "f (const)\n"; | ||
- | m_ptrX.g(); | ||
- | } | ||
- | void f() | + | ====Encapsuler fopen/ |
- | { | + | |
- | std::cout << "f (non-const)\n"; | + | |
- | m_ptrX.g(); | + | |
- | } | + | |
- | // Ici, X est une instance sans pointeur. | + | <code cpp> |
- | X m_ptrX; | + | std:: |
- | }; | + | |
</ | </ | ||
- | Rendu sans surprise | + | [[https:// |
- | < | + | ====weak_ptr==== |
- | f (non-const) | + | |
- | g (non-const) | + | ====std:: |
- | f (const) | + | Il faut utiliser le comparateur '' |
- | g (const) | + | <code cpp> |
+ | std:: | ||
</ | </ | ||
- | Si la méthode '' | + | ===Différencier empty et expired=== |
- | ===Cas avec un pointeur unique=== | + | Sans passer par '' |
<code cpp> | <code cpp> | ||
- | struct Y | + | #include < |
- | { | + | #include < |
- | Y() : m_ptrX{} { } | + | |
- | void f() const | + | class A {}; |
+ | |||
+ | int main() { | ||
{ | { | ||
- | std::cout << | + | std::weak_ptr<A> aa; |
- | | + | |
+ | if (!aa.owner_before(std:: | ||
+ | std::cout << " | ||
+ | | ||
+ | if (aa.expired()) { | ||
+ | std::cout << " | ||
+ | } | ||
} | } | ||
- | void f() | ||
{ | { | ||
- | std::cout << | + | std::shared_ptr<A> a; |
- | | + | std:: |
+ | |||
+ | if (!aa.owner_before(std:: | ||
+ | std::cout << " | ||
+ | | ||
+ | if (aa.expired()) { | ||
+ | std::cout << " | ||
+ | } | ||
} | } | ||
- | std::unique_ptr<X> m_ptrX; | + | |
- | }; | + | |
- | </code> | + | { |
+ | | ||
+ | aa = a; | ||
- | Rendu : | + | if (!aa.owner_before(std::weak_ptr<A>{}) && !std:: |
- | + | | |
- | <code cpp> | + | } |
- | f (non-const) | + | if (aa.expired()) { |
- | g (non-const) | + | std::cout << |
- | f (const) | + | } |
- | g (non-const) | + | } |
- | </code> | + | if (!aa.owner_before(std::weak_ptr<A>{}) && !std::weak_ptr<A>{}.owner_before(aa)) { |
- | + | | |
- | On ne respecte la l' | + | } |
- | + | if (aa.expired()) { | |
- | ===Cas avec un pointeur unique et propagate_const=== | + | |
- | + | } | |
- | Prérequis | + | } |
- | + | | |
- | <code cpp> | + | } |
- | # | + | |
- | std::experimental:: | + | |
- | </code> | + | |
- | + | ||
- | Rendu : | + | |
- | + | ||
- | <code> | + | |
- | f (non-const) | + | |
- | g (non-const) | + | |
- | f (const) | + | |
- | g (const) | + | |
</ | </ |
lang/cpp/smartptr.1571296408.txt.gz · Dernière modification : de root