扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
classRCObject { public: RCObject():refCount(0),shareable(true){} RCObject(constRCObject&):refCount(0),shareable(true){} RCObject& operator=(constRCObject& rhs){return *this;} virtual ~RCObject()=0; void AddReference(){++refCount;} void RemoveReference(){if (--refCount == 0) deletethis;} void markUnshareable(){shareable = false;} bool isShareable() const{returnshareable;} bool isShared() const {returnrefCount > 1;} private: int refCount; bool shareable; }; RCObject::~RCObject(){} template <classT> class RCPtr { public: RCPtr(T* realPtr = 0):pointee(realPtr){init();} RCPtr(constRCPtr& rhs):pointee(rhs.pointee){init();} ~RCPtr(){if (pointee) pointee->RemoveReference();} RCPtr& operator = (constRCPtr& rhs) { if (pointee!=rhs.pointee) { if (pointee) pointee->RemoveReference(); pointee = rhs.pointee; init(); } return *this; } T* operator->() const { returnpointee;} T& operator*() const{return *pointee;} private: T* pointee; void init() { if (pointee == 0) return; if (pointee->isShareable() == false) pointee = newT(*pointee); pointee->AddReference(); } }; class String { public: String(const char* value = ""):value(newStringValue(value)){} const char& operator[](intnIndex) const { return value->data[nIndex]; } char& operator[](intnIndex) { if (value->isShared()) value = newStringValue(value->data); value->markUnshareable(); returnvalue->data[nIndex]; } protected: private: struct StringValue:publicRCObject { char* data; String Value(constchar* initValue) { init(initValue); } String Value(constStringValue& rhs) { init(rhs.data); } void init(constchar * initValue) { data = newchar[strlen(initValue) + 1]; strcpy(data,initValue); } ~String Value() { delete [] data; } }; RCPtr<StringValue> value; }; |
classRCObject { public: RCObject():refCount(0),shareable(true){} RCObject(constRCObject&):refCount(0),shareable(true){} RCObject& operator=(constRCObject& rhs){return *this;} virtual ~RCObject()=0; void AddReference(){++refCount;} void RemoveReference(){if (--refCount == 0) deletethis;} void markUnshareable(){shareable = false;} bool isShareable() const{returnshareable;} bool isShared() const {returnrefCount > 1;} private: int refCount; bool shareable; }; RCObject::~RCObject(){} template<classT> class RCIPtr { public: RCIPtr(T* realPtr = 0):counter(new CountHolder) { counter->pointee = realPtr; init(); } RCIPtr(constRCIPtr& rhs):counter(rhs.counter) { init(); } ~RCIPtr() { counter->RemoveReference(); } RCIPtr& operator = (constRCIPtr& rhs) { if (counter != rhs.counter) { counter->RemoveReference(); counter = rhs.counter; init(); } return *this; } constT* operator->()const { returncounter->pointee; } T* operator->() { makeCopy(); returncounter->pointee; } constT& operator*() const { return *(counter->pointee); } T& operator*() { makeCopy(); return *(counter->pointee); } private: struct CountHolder:publicRCObject { ~Count Holder(){deletepointee;} T* pointee; }; Count Holder* counter; void init() { if (counter->isShareable() == false) { T* oldValue = counter->pointee; counter = newCountHolder; counter->pointee = newT(*oldValue); } counter->AddReference(); } void makeCopy() { if (counter->isShared()) { T* oldValue = counter->pointee; counter->RemoveReference(); counter = newCountHolder; counter->pointee = newT(*oldValue); counter->AddReference(); } } }; class Widget { public: Widget(intSize){} Widget(constWidget& rhs){} ~Widget(){} Widget operator=(const Widget& rhs){} void doThis(){printf("doThis()\n");return;} int showThat() const{printf("showThat()\n"); return 0;} protected: private: inti; }; class RCWidget { public: RCWidget(intsize):value(newWidget(size)){} void doThis(){value->doThis();} int showThat()const {returnvalue->showThat();} protected: private: RCIPtr<Widget> value; }; |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者