可否用承继代替autoptr

FinalC 2011-09-09 05:17:07

已经实现一个class A,A存储在一个容器中,在多线程中使用A时,谁取出一次使用就必须增加一个计数,使用完毕则归还计数,计数为0的才可以删除,以避免一个线程在使用,另一个线程却删除A的情况。

一个简单的办法是可以用AutoPtr来封装A,在类的构造和析构中自动执行计数操作,但通过AutoPtr对A的操作不是很直观。

是否可以设计一个clase B,B承继自A,在B的构造和析构中执行计数操作,同时因为B承继自A,可以直观调用A的所有成员函数。

问题的症结在于,B在构造过程中如何与指定的A的实例融合,把A的指针传给B,但B调用A成员函数用的是THIS指针,如何让让THIS指针指向A呢
...全文
131 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackyjkchen 2011-09-09
  • 打赏
  • 举报
回复
别用auto_ptr,不靠谱
masterz 2011-09-09
  • 打赏
  • 举报
回复
Kevin_qing 2011-09-09
  • 打赏
  • 举报
回复
template <typename T>class refPtr{
T* ptr;
public:
refPtr(T *p):ptr(p){
assert(p);
p->addRef();
}

~refPtr(){
ptr->release();
}

T* operator ->(){
return ptr;
}
};

class refObject{
long nRef;
public:
refObject():nRef(0){
}
long addRef(){
return InterlockedIncrement(&nRef);
}
long release(){
LONG r=InterlockedDecrement(&nRef);
if(r==0)
delete this;
return 0;
}

virtual ~refObject()=0{
}
};

你的类继承refObject;
然后用法
refPtr<yourObject> ptr(new yourObject);
ptr->someFuntion();


refPtr的copy 构造啥的,你需要的话自己写把



FinalC 2011-09-09
  • 打赏
  • 举报
回复
其实就想自动管理A的使用者计数,但同时又想直接使用A的各种成员函数,目前来看似乎AutoPtr是个不错的选择,只是使用时可能需要在AuotPtr重载一个操作符,比如 A& operator(){ return *A;}

还有更好的选择吗?
limang89 2011-09-09
  • 打赏
  • 举报
回复
引用计数。。。AutoPtr类中 最好加上拷贝构造函数 和 重载 = 号运算符
healer_kx 2011-09-09
  • 打赏
  • 举报
回复
AutoPtr不是说尽量不用嘛。
3 目录 说明 ..................................................................................................................... 1. 如何做动画 ................................................................................................. 2. OpenFOAM 第 5 次 workshop ................................................................... 3. OpenFOAM 中不可压缩湍流大涡求解器 oodles 说明 ........................... 4. OpenFOAM 中的神奇方程定义方式的背后 ............................................. 5. OpenFOAM 中雷诺时均湍流求解器 turbFoam 使用 ............................... 6. pimple 算法简述 (2009-09-30 09:22:33) 转载 .......................................... 7. 粒子方法讨论版开版 .................................................................................. 8. 面向对象—我的一点理解 .......................................................................... 9. 如何搞多面体网格 ...................................................................................... 10. OpenFOAM-1.6-ext 的安装过程探讨 ................................................... 11. 多态实现及其子类父类数据传递的方式 ............................................. 12. OpenFOAM 与有限元程序包 deal.II 的无缝耦合方法 ........................ 13. CAD->GAMBIT->CFD几何 ...................................................................... 14. OpenFOAM 中非均匀初始场的设定 ..................................................... 15. OpenFOAM-1.6 中 sample 的使用 ......................................................... 16. 利用 pyFOAM 残差的输出 ...................................................................... 17. 也来谈谈传值和传址 .............................................................................. 18. 从 pisoFoam 谈谈 OpenFOAM-1.6 湍流模型的结构变化 ................... 19. 非惯性旋转系统稳态求解器 simpleSRFFoam的使用 ........................ 20. linux 常用命令集 ..................................................................................... 21. 一起看看 OpenFOAM-1.6 中的 pisoFoam .......................................... 22. 一起看看 OpenFOAM-1.6 中的 pisoFoam .......................................... 23. 深入解析 OpenFOAM 时间控制参数字典文件 controlDict ................. 24. OpenFOAM 中的智能指针 autoPtr ........................................................ 25. 如何实现同一用户下的 OpenFOAM 多版本编译 ................................ 26. 商业软件划分的网格向 OpenFOAM 转换应注意的问题 .................... 27. OpenFOAM 如何定义与时间有关的边界条件 ..................................... 28. OpenFOAM 中 transportModel 与 viscosityModels 关系 .................... 29. OpenFOAM 不可压缩流边界条件的设定之我见 ................................. 30. OpenFOAM 中气液双欧拉求解器 bubbleColumn 的使用 .................. 31. OpenFOAM 不可压缩非牛顿流体层流求解器使用说明 ..................... 32. OpenFOAM 中不可压缩稳态求解器 simpleFoam 的使用 .................. 33. 深入解析 OpenFOAM 离散格式参数字典文件 fvSchemes................. 34. 如何使得 OpenFOAM 的 solver 自动调节时间步长 ........................... 35. OpenFOAM 中不可压缩流大涡求解器 oodles 的使用 ....................... 36. OpenFOAM 中的不可压缩湍流流动求解器 turbFoam 的说明 .......... 37. 深入解析 icoFoam 下的顶盖驱动流 (cavity) .........................................
Qt源码剖析-智能指针 ⽬录 智能指针是什么? 智能指针是什么? 1. 智能指针是使⽤RAII技术(惯⽤⼿法)对裸指针进⾏封装、隔离、管理。 2. 把堆对象转移为栈对象。 为什么使⽤ 为什么使⽤QT智能 智能(smart)指针? 指针? CPP中在使⽤堆内存时我们必须使⽤指针,使⽤指针给我带来便利和强⼤的威⼒同时也给我们带来了很多隐患,所以指针也是把双刃剑。 常见的隐患有: 1. 我们在使⽤new创建⼀个对象的同时,由于种种原因⽽忘记了delete从⽽导致内存泄漏影响应⽤运⾏效率 2. 我们在使⽤⼀个指针的时候不知道该指针指向的对象是否已经析构,从⽽导致使⽤⼀个错误的野指针。 针对上述问题Qt提供⼀组类模板(Smart指针类)来管理C++中的裸指针, 同时提供相关重载运算符使得使⽤起来与指针操作⽆异。 指针的⽣ 命周期也交由Smart类来管理⽽不⽤程序员⾃⼰去⼿动管理。使⽤Smart指针进⽽避免了上述隐患的存在。 Qt提供了哪些智能指针? 提供了哪些智能指针? QPointer、QSharedPointer、QScopedPointer、QWeakPointer、QSharedDataPointer、QExplicitlySharedDataPointer、 QGuard、QtPatternist::AutoPtr 由于Qt智能指针较多,避免篇幅较长本⽂只对平时使⽤场景较多的QSharedPointer源码进⾏分析也⽐较有代表性 QSharedPointer 官⽅介绍: QSharedPointer类持有对共享指针的强引⽤。QSharedPointer是c++中的⼀个⾃动共享指针。它的⾏为与⽤于普通⽬的的普通指针完全 相同,包括对constness的尊重。当指针超出作⽤域时,QSharedPointer将删除它所持有的指针,前提是没有其他QSharedPointer对象 引⽤它。QSharedPointer对象可以从普通指针、另⼀个QSharedPointer对象或通过将QWeakPointer对象提升为强引⽤来创建。 本⽂基于Qt5.12.4版本分析 QSharedPointer类模板 类模板(smart指针类 指针类)源码分析 源码分析 QSharedPointer类源码篇幅较长,避免出现阅读疲劳以下分段解读。 1. QSharedPointer类模板对于模板参数 类模板对于模板参数T的类型重定义 的类型重定义 template class QSharedPointer { typedef T *QSharedPointer:: *RestrictedBool; typedef QtSharedPointer::ExternalRefCountData Data; public: typedef T Type; typedef T element_type; typedef T value_type; typedef value_type *pointer; typedef const value_type *const_pointer; typedef value_type &reference; typedef const value_type &const_reference; typedef qptrdiff difference_type; }; QSharedPointer提供了部分公有和私有的对于模板参数T的类型重定义(说明: 这⾥T类型并不是指⼀个特定类型,⽽是⼀个通⽤/万能类 型。 我们可以把类模板看做成⼀个函数 QSharedPointer为函数名, template中类型列表的为函数形参列表,typedef 为返回值。 T最终 的类型确认待你使⽤时由编译器实例化模板时才能推导出),QSharedPointer类模板分别重定义了模板⼊参T的类型别名、指针、常指针、 引⽤、常引⽤类型。这也是模板的惯⽤⼿法和伎俩⽅便对于类型的获取和使⽤ 原因有以下⼏点: a. 提供公有的对于T的类型重定义⽅便的类外部获取和使⽤T及其衍⽣类型。 b. 类内部实现过程中统⼀,规范对于T的使⽤。 2. QSharedPointer的成员属性 的成员属性 template class QSharedPointer { // @1 Type *value; // @2 Data *d; }; QSharedPointer成员属性⽐较简洁代码段@1声明成员属性value(需要管理的裸指针), 代码段@2声明属性d。Data类型我们从第1点中可 知为QtSharedPointer::ExternalRefCountData 的类型别名。主要作⽤为记录当前持有value的QSharedPointer

64,680

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧