diff --git a/src/kiwano/base/ObjectBase.cpp b/src/kiwano/base/ObjectBase.cpp index 7dd31480..63b9a900 100644 --- a/src/kiwano/base/ObjectBase.cpp +++ b/src/kiwano/base/ObjectBase.cpp @@ -87,6 +87,7 @@ ObjectBase::ObjectBase() , name_(nullptr) , user_data_(nullptr) , status_(nullptr) + , holdings_(nullptr) , id_(++last_object_id) { #ifdef KGE_DEBUG @@ -104,6 +105,12 @@ ObjectBase::~ObjectBase() ClearStatus(); + if (holdings_) + { + delete holdings_; + holdings_ = nullptr; + } + #ifdef KGE_DEBUG ObjectBase::RemoveObjectFromTracingList(this); #endif @@ -119,6 +126,23 @@ void ObjectBase::SetUserData(void* data) user_data_ = data; } +void ObjectBase::Hold(ObjectBasePtr other) +{ + if (!holdings_) + { + holdings_ = new Set; + } + holdings_->insert(other); +} + +void ObjectBase::Unhold(ObjectBasePtr other) +{ + if (holdings_) + { + holdings_->erase(other); + } +} + void ObjectBase::SetName(const String& name) { if (IsName(name)) diff --git a/src/kiwano/base/ObjectBase.h b/src/kiwano/base/ObjectBase.h index 6bd6bb9a..8fbf9864 100644 --- a/src/kiwano/base/ObjectBase.h +++ b/src/kiwano/base/ObjectBase.h @@ -161,8 +161,19 @@ public: /// \~chinese /// @brief 设置用户数据 + /// @param data 数据指针 void SetUserData(void* data); + /// \~chinese + /// @brief 持有一个对象并管理其生命周期 + /// @param other 对象指针 + void Hold(ObjectBasePtr other); + + /// \~chinese + /// @brief 放弃持有的对象 + /// @param other 对象指针 + void Unhold(ObjectBasePtr other); + /// \~chinese /// @brief 获取对象ID uint64_t GetObjectID() const; @@ -232,7 +243,8 @@ private: String* name_; void* user_data_; - ObjectStatus* status_; + ObjectStatus* status_; + Set* holdings_; }; inline String ObjectBase::GetName() const