首页 > 编程语言 >C++ 用智能指针这样包装 this 指针是否可行

C++ 用智能指针这样包装 this 指针是否可行

时间:2024-07-16 14:40:18浏览次数:13  
标签:... 可行 Obj cout am C++ pa Hello 指针

#include <iostream>
#include <memory>

using namespace std;

class A;
class B
{
public:
    B(shared_ptr<A> a)
    {
        pa = a;
        cout << "B 构造..." << endl;
    }
    ~B()
    {
        cout << "B 析构..." << endl;
    }
    shared_ptr<A> pa;

public:
    void Hello()
    {
        cout << "hello I am B Obj." << endl;
    }
};

class C
{
public:
    C(shared_ptr<A> a)
    {
        pa = a;
        cout << "C 构造..." << endl;
    }
    ~C()
    {
        cout << "C 析构..." << endl;
    }
    shared_ptr<A> pa;

public:
    void Hello()
    {
        cout << "hello I am C Obj." << endl;
    }
};

class A
{
public:
    A()
    {
        cout << "A 构造..." << endl;
        self = shared_ptr<A>(this, [](A* a) { cout << "跳过 delete." << endl; });
        pb = make_shared<B>(self);
        pc = make_shared<C>(self);
    }
    ~A()
    {
        cout << "A 析构..." << endl;
    }
    shared_ptr<B> pb;
    shared_ptr<C> pc;
private:
    shared_ptr<A> self;
public:
    void Hello()
    {
        cout << "hello I am A Obj." << endl;
    }
};

int main()
{
    auto a = make_shared<A>();

    a->pb->Hello();
    a->pc->Hello();
    a->pb->pa->Hello();
    a->pc->pa->Hello();

    system("pause");
    return 0;
}

输出:

A 构造...
B 构造...
C 构造...
hello I am B Obj.
hello I am C Obj.
hello I am A Obj.
hello I am A Obj.
请按任意键继续. . .
A 析构...
C 析构...
B 析构...
跳过 delete.

.exe (进程 1940)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

标签:...,可行,Obj,cout,am,C++,pa,Hello,指针
From: https://www.cnblogs.com/huvjie/p/18305194

相关文章

  • C++游戏篇1“很好的游戏,使我手指旋转”(原创)
    话不多说,上代码!#include<bits/stdc++.h>#include<windows.h>usingnamespacestd;intGe,Fen,timp,F,a[22][6];doubleShi,B;voidS(intForgC,intBackC){WORDwColor=((BackC&0x0F)<<4)+(ForgC&0x0F);SetConsoleTextAttribute(GetS......
  • C++转换进制
    前言本蒟蒻:让C++转进制?我都不会转,更何况让C++转。正文转进制,我们要知道36进制的0-35都用什么表示。0-9就是0-9,而10-35分别是ABCDEFG........RSTUVWXYZ。我们可以设一个字符串表示0-35:strings="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";重要的一步来了,参考以下方法,用while......
  • 底软驱动 | 大厂面试爱考的C++内存相关
    文章目录C++内存相关C++内存分区C++对象的成员函数存放在内存哪里堆和栈的区别堆和栈的访问效率“野指针”有了malloc/free为什么还要new/deletealloca内存崩溃C++内存泄漏的几种情况内存对齐柔性数组参考推荐阅读C++内存相关本篇介绍了C++内存相关的知识。C++......
  • 虚函数表 和 虚函数指针
     虚函数指针vptr大小x86平台下为4个字节,x64平台下为8个字节例题:涉及内存对齐 答案:32位miaoage=264位miaoage=1核心在这句话上p【1】=q【1】;由于两个子类都继承自有虚函数的基类因此都带有虚表指针首先基类中只有一个int432位下,虚表指针也是4......
  • 逆序打印c++
    逆序打印c++第一次写文章请大佬多多指教说明输入n个数,要求程序按输入时的逆序把这n个数打印出来,已知整数不超过100个。也就是说,按输入相反顺序打印这n个数。输入格式两行,第一行,一个整数N;第2-N+1行,N个整数。输出格式一行,按相反顺序输出这N个数,中间用空格隔开。样例......
  • 嵌入式C语言指针面试题大全(持续更新)
    什么是指针?指针在C语言中的作用是什么?在C语言中,指针是一种变量类型,它存储的是其他变量或数据结构的内存地址,而不是实际的数据值。指针允许程序员直接操作和管理内存,这是C语言的一个重要特性,也是它能够高效地处理资源和进行底层编程的原因之一。指针在C语言中有多种作用,包括......
  • C/C++ 逗号表达式的注意事项
    在C和C++中,逗号表达式是一种使用逗号运算符,分隔的表达式序列。逗号运算符用于顺序执行其操作数,并返回最后一个操作数的结果。尽管逗号表达式在某些情况下很有用,但它们也需要注意一些重要的细节和潜在的问题。1.逗号表达式的定义和用法逗号表达式由一系列表达式组成,这些表......
  • C++程序设计(谭浩强) 课后习题第五章第6~9题
    6.#include<iostream>usingnamespacestd;classA{public: voidf1(){cin>>i;A::f2();}protected: voidf2(){cout<<"i="<<i<<endl;}private: inti;};classB:publicA{public: voidf3(){cin>>k;cout<......
  • 【C语言】指针由浅入深全方位详解
    目录指针定义指针类型野指针指针运算 指针与数组的联系二级指针 指针数组 字符指针 数组指针 数组参数,指针参数 函数指针 函数指针数组回调函数 练习题 代码仓库 指针定义1.指针是内存中一个最小单元的编号,也就是地址。2.平时口语中说的指针,......
  • C++(2) 从yml或者txt读取和保存数据
      %YAML:1.0---gps:"2132312" CMakeLists.txtcmake_minimum_required(VERSION3.5)set(CMAKE_CXX_STANDARD11)#设置项目名称和语言project(run_nodeLANGUAGESCXX)#设置opencv安装路径#set(CMAKE_PREFIX_PATH"/home/r9000k/v1_software/opencv/o......