带引用计数的String类简单实现

本文通过一个简单的C++字符串类设计实例,展示了类设计、模板使用、继承及封装等概念。该字符串类利用引用计数技术进行内存管理,并采用智能指针管理类属性。

很好的一个示范例子,设计到类设计,模版,继承,封装。

麻雀虽小五脏俱全,废话少说,来看代码:

主程序:

 1 #include <iostream>
 2 
 3 #include "rcstring.h"
 4 
 5 int main(void)
 6 {
 7     String s("hello");
 8 
 9     std::cout << s[2] << std::endl;
10 
11     std::cout << "Hello World!" << std::endl;
12 
13     return 0;
14 }

String声明和实现:

 1 //rcstring.h
 2 #include "rcobject.h"
 3 #include "rcptr.h"
 4 
 5 class String {
 6 public:
 7     String(const char *value = "");
 8     const char& operator[] (int index) const;
 9     char & operator[] (int index);
10 private:
11     struct StringValue: public RCObject {
12         StringValue(const char *initValue);
13         StringValue(const StringValue &rhs);
14         ~StringValue();
15 
16         void init(const char *initValue);
17 
18         char *data;
19     };
20 
21     RCPtr<StringValue> value;
22 };
23 
24 //rcstring.cpp
25 #include "rcstring.h"
26 #include <cstring>
27 
28 String::String(const char *initValue)
29     :value(new StringValue(initValue))
30 {
31 
32 }
33 
34 const char& String::operator[] (int index) const
35 {
36     return value->data[index];
37 }
38 
39 char& String::operator[] (int index)
40 {
41     if(value->isShared())
42         value = new StringValue(value->data);
43 
44     value->markUnshareable();
45 
46     return value->data[index];
47 }
48 
49 String::StringValue::StringValue(const char *initValue)
50 {
51     init(initValue);
52 }
53 
54 String::StringValue::StringValue(const StringValue& rhs)
55 {
56     init(rhs.data);
57 }
58 
59 String::StringValue::~StringValue()
60 {
61     delete [] data;
62 }
63 
64 void String::StringValue::init(const char *value)
65 {
66     data = new char[strlen(value) + 1];
67     strcpy(data, value);
68 }

引用计数类rcobject:

 1 //rcobject.h
 2 
 3 class RCObject {
 4 protected:
 5     RCObject();
 6     RCObject(const RCObject &rhs);
 7     RCObject& operator=(const RCObject &rhs);
 8     virtual ~RCObject() = 0;
 9 
10 public:
11     void addReference();
12     void removeReference();
13     void markUnshareable();
14     bool isShareable() const;
15     bool isShared() const;
16 private:
17     int refCount;
18     bool shareable;
19 };
20 
21 
22 //rcobject.cpp
23 #include "rcobject.h"
24 
25 RCObject::RCObject()
26     : refCount(0), shareable(true)
27 {
28 
29 }
30 
31 RCObject::RCObject(const RCObject &rhs)
32     :refCount(0), shareable(true)
33 {
34 
35 }
36 
37 RCObject& RCObject::operator=(const RCObject &rhs)
38 {
39     return *this;
40 }
41 
42 RCObject::~RCObject()
43 {
44 
45 }
46 
47 void RCObject::addReference()
48 {
49     ++refCount;
50 }
51 
52 void RCObject::removeReference()
53 {
54     if(--refCount == 0) delete this;
55 }
56 
57 void RCObject::markUnshareable()
58 {
59     shareable = false;
60 }
61 
62 bool RCObject::isShareable() const
63 {
64     return shareable;
65 }
66 
67 bool RCObject::isShared() const
68 {
69     return refCount > 1;
70 }

用来管理rcstring属性的简单智能指针:

 1 //rcptr.h
 2 
 3 template <typename T>
 4 class RCPtr {
 5 public:
 6     RCPtr(T *realPtr = 0);
 7     RCPtr(const RCPtr &rhs);
 8     ~RCPtr();
 9 
10 public:
11     RCPtr& operator= (const RCPtr &rhs);
12     T* operator-> ()const;
13     T& operator* ()const;
14 
15 private:
16     T *pointee;
17     void init();
18 };
19 
20 template <typename T>
21 RCPtr<T>::RCPtr(T *realPtr)
22     :pointee(realPtr)
23 {
24     init();
25 }
26 
27 template <typename T>
28 RCPtr<T>::RCPtr(const RCPtr& rhs)
29     :pointee(rhs.pointee)
30 {
31     init();
32 }
33 
34 template <typename T>
35 RCPtr<T>& RCPtr<T>::operator=(const RCPtr& rhs)
36 {
37     if(pointee != rhs.pointee) {
38         if(pointee) pointee->removeReference();
39 
40         pointee = rhs.pointee;
41 
42         init();
43     }
44 
45     return *this;
46 }
47 
48 template <typename T>
49 RCPtr<T>::~RCPtr()
50 {
51     if(pointee) pointee->removeReference();
52 }
53 
54 template <typename T>
55 T* RCPtr<T>::operator-> () const 
56 {
57     return pointee;
58 }
59 
60 template <typename T>
61 T& RCPtr<T>::operator* () const
62 {
63     return *pointee;
64 }
65 
66 template <typename T>
67 void RCPtr<T>::init()
68 {
69     if(pointee == 0) return;
70     if(pointee->isShareable() == false)
71         pointee = new T(*pointee);
72 
73     pointee->addReference();
74 }

 

转载于:https://www.cnblogs.com/jojodru/archive/2013/01/15/2861335.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值