c++只在堆上构建对象

原文地址
要求:只允许在上建对象,即用共针/独针来创建对象.直觉方法:私有构造,提供静态方法:

构 挂名{
    静 动 创建(){
      中 造共<挂名>();//静态方法
    }
私:
    挂名(){}//私有
};

整 主(){
  挂名 d{};//编译错误
  动 针=挂名::创建();//@1
}

@1失败,是因为造共要访问私有构造函数.再改:

构 挂名{
    静 动 创建(){
      中 共针<挂名>(新 挂名());
    }
私:
    挂名(){}
};

整 主(){
  //挂名 d{};//编译失败
  动 针=挂名::创建();//好
}

这里,通过构造对象,可以访问私有构造函数.
造共性能好,这时,用友元.因为可以访问私函数.改造为:

元<型名 T>类 令牌{
私:
    令牌(){}
    友 T;
};
//不必声明为内部类.内部类一点优势都没有啦.
构 挂名{
    静 动 创建(){//挂名可访问令牌.
        令牌<挂名>t;中 造共针<挂名>(t);
    }
    挂名(令牌<挂名>):挂名(){}
    //这是通过该令牌来构造.造共调用该构造函数.
私:
    挂名(){}
};

空 主(){
  //挂名 d{};//编译失败
  //挂名 d(令牌{});//失败
  动 针=挂名::创建();//好
}

令牌,有两个作用:1,避免在栈上构造,2,提供构造函数.对造独针也是一样.类似实现.
而实际需求,则是如果一个对象允许从此共享(enable_shared_from_this)中派生,如果要调用其从此共享(shared_from_this)方法,则必须为堆对象,如果为,则会崩溃.因而使用继承允许从此共享的对象时,要求其必须在堆上构建.
如果,要求只能在上构建呢?
Kean提供的另一方法:

构 挂名{
    空 删除器(){删 本;}//通过其来释放.
私:
    ~挂名(){输出<<"析构挂名"<<行尾;}
//私有析构
};

整 主(){
    //挂名 d;//编译失败
    挂名*针=新 挂名();
    针->删除器();
    动 针1=共针<挂名>(新 挂名(),[](挂名*插入){插入->删除器();});//后面是自定义析构器.
}

将析构定义为私有,则不能在栈上构造,因为时要析构.不能访问,就有问题了.而在上,则由程序员控制析构函数.
声明变参参考地址,这里的解法不很好.
结合这里,可以实现,只在栈上构建对象,即私有符号 新/删.

posted @   zjh6  阅读(16)  评论(0编辑  收藏  举报  
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示