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 [2022/12/28 10:35] – Ajout de "Encapsuler fopen/close" 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 33: | Ligne 33: | ||
| </ | </ | ||
| - | ====std:: | + | |
| - | Il faut utiliser le comparateur '' | + | ====Encapsuler fopen/close==== | 
| <code cpp> | <code cpp> | ||
| - | std::map<U, T, std::owner_less< | + | std::unique_ptr<FILE, decltype(& | 
| </ | </ | ||
| - | ====Préserver l' | + | [[https:// | 
| - | Il faut utiliser '' | + | |
| - | Il existe aussi '' | + | ====weak_ptr==== | 
| - | + | ||
| - | Soit la classe commune '' | + | |
| + | ====std:: | ||
| + | Il faut utiliser le comparateur '' | ||
| <code cpp> | <code cpp> | ||
| - | struct X | + | std::map<U, T, std::owner_less<U>> destination; | 
| - | { | + | |
| - | void g() const { std::cout << "g (const)\n"; | + | |
| - | void g() { std::cout << "g (non-const)\n"; | + | |
| - | }; | + | |
| </ | </ | ||
| - | et le programme commun : | + | ===Différencier empty et expired=== | 
| + | |||
| + | Sans passer par '' | ||
| <code cpp> | <code cpp> | ||
| - | int main() | + | #include < | 
| - | { | + | #include < | 
| - | Y y; | + | |
| - | y.f(); | + | |
| - | const Y cy; | + | class A {}; | 
| - | cy.f(); | + | |
| - | } | + | |
| - | </code> | + | int main() { | 
| + | { | ||
| + | std:: | ||
| - | * Cas avec la classe '' | + | if (!aa.owner_before(std:: | 
| - | + |  | |
| - | <code cpp> | + | } | 
| - | struct Y | + | if (aa.expired()) { | 
| - | { | + | std::cout << " | 
| - | Y() { } | + | } | 
| + |  | ||
| - | void f() const | ||
| { | { | ||
| - | std::cout << "f (const)\n" | + | std::shared_ptr<A> a; | 
| - |  | + |  | 
| - | } | + | |
| - | void f() | + | if (!aa.owner_before(std:: | 
| - |  | + | std::cout << "empty2\n"; | 
| - | std::cout << "f (non-const)\n"; | + |  | 
| - |  | + | if (aa.expired()) { | 
| + | std::cout << " | ||
| + | } | ||
| } | } | ||
| - | // 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" | + | std::weak_ptr<A> aa; | 
| - |  | + |  | 
| - | } | + | std:: | 
| + | aa = a; | ||
| - | void f() | + | if (!aa.owner_before(std:: | 
| - | { | + |  | 
| - | std::cout << "f (non-const)\n"; | + | } | 
| - |  | + | if (aa.expired()) | 
| + | std::cout << "expired3\n"; | ||
| + | } | ||
| + | } | ||
| + | if (!aa.owner_before(std:: | ||
| + | std::cout << " | ||
| + |  | ||
| + | if (aa.expired()) { | ||
| + | std::cout << " | ||
| + | } | ||
| } | } | ||
| - | + | return 0; | |
| - | 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:// | ||
lang/cpp/smartptr.1672220144.txt.gz · Dernière modification :  de root
                
                