c++只在堆上构建对象
原文地址
要求:只允许在堆
上建对象,即用共针/独针
来创建对象.直觉方法:私有构造,提供静态方法
:
构 挂名{
静 动 创建(){
中 造共<挂名>();//静态方法
}
私:
挂名(){}//私有
};
整 主(){
挂名 d{};//编译错误
动 针=挂名::创建();//@1
}
@1失败,是因为造共
要访问私有构造
函数.再改:
构 挂名{
静 动 创建(){
中 共针<挂名>(新 挂名());
}
私:
挂名(){}
};
整 主(){
//挂名 d{};//编译失败
动 针=挂名::创建();//好
}
这里,通过新
来构造对象
,可以访问私有构造
函数.
造共
比新
性能好,这时,用友元
.因为友
可以访问私函数
.改造为:
元<型名 T>类 令牌{
私:
令牌(){}
友 T;
};
//不必声明为内部类.内部类一点优势都没有啦.
构 挂名{
静 动 创建(){//挂名可访问令牌.
令牌<挂名>t;中 造共针<挂名>(t);
}
挂名(令牌<挂名>):挂名(){}
//这是通过该令牌来构造.造共调用该构造函数.
私:
挂名(){}
};
空 主(){
//挂名 d{};//编译失败
//挂名 d(令牌{});//失败
动 针=挂名::创建();//好
}
令牌,有两个作用:1,避免在栈上构造
,2,提供构造函数
.对造独针
也是一样.类似实现.
而实际需求,则是如果一个对象
从允许从此共享(enable_shared_from_this)
中派生,如果要调用其从此共享(shared_from_this)
方法,则必须为堆对象
,如果为栈
,则会崩溃
.因而使用继承允许从此共享
的对象时,要求其必须在堆上构建.
如果,要求只能在栈
上构建呢?
Kean
提供的另一方法
:
构 挂名{
空 删除器(){删 本;}//通过其来释放.
私:
~挂名(){输出<<"析构挂名"<<行尾;}
//私有析构
};
整 主(){
//挂名 d;//编译失败
挂名*针=新 挂名();
针->删除器();
动 针1=共针<挂名>(新 挂名(),[](挂名*插入){插入->删除器();});//后面是自定义析构器.
}
将析构定义为私有
,则不能在栈上构造,因为栈
出域
时要析构.不能访问,就有问题了.而在堆
上,则由程序员控制
析构函数.
声明友
变参参考地址,这里的解法不很好.
结合这里,可以实现,只在栈上构建对象
,即私有符号 新/删
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现