BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #44576同步于 2010/10/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

求助大牛!Reference类到底要实现什么功能啊!??

starwars
2010/10/9镜像同步4 回复
我在研究一个很大的算法,其中有一个类看不懂,搞不清楚这个类的功能。这个类的功能对于理解整个算法有至关重要的作用,所以我卡在这里了!!! 请大牛帮我研究一下,详见下面两个文件。每个文件定义一个类,内容很少的,麻烦看一下吧。 文件ReferenceObject.h定义了类ReferenceObject,这个类我研究明白了。其实类ReferenceObject实现了双向链表的功能。 但是文件Reference.h定义的类Reference没有弄明白,类Reference是利用类ReferenceObject实现其功能的。 附件(7.4KB) ReferenceObject.h 附件(4.5KB) Reference.h
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
starwars机器人#1 · 2010/10/9
首先是类REFERENCE_OBJECT,功能就是现实“双向链表”! 别看程序这么长,其实很简单的,无非是向“双向链表”添加一个元素或者删除一个元素 //+----------------------------------------------------------------------------- //| Inclusion guard //+----------------------------------------------------------------------------- #ifndef MAGOS_REFERENCE_OBJECT_H #define MAGOS_REFERENCE_OBJECT_H //+----------------------------------------------------------------------------- //| Included files //+----------------------------------------------------------------------------- #include "Common.h" //+----------------------------------------------------------------------------- //| Pre-declared classes //+----------------------------------------------------------------------------- class REFERENCE; //+----------------------------------------------------------------------------- //| Reference object class //+----------------------------------------------------------------------------- class REFERENCE_OBJECT { public: REFERENCE_OBJECT(); REFERENCE_OBJECT(CONST REFERENCE_OBJECT& CopyObject); virtual ~REFERENCE_OBJECT(); CONST REFERENCE_OBJECT& operator =(CONST REFERENCE_OBJECT& CopyObject); VOID Clear(); VOID SetData(int NewData); int GetData() CONST; REFERENCE* GetFirstReference() CONST; REFERENCE* GetLastReference() CONST; REFERENCE* GetNextReference(REFERENCE<TYPE, int>* Reference) CONST; REFERENCE* GetPreviousReference(REFERENCE* Reference) CONST; INT GetReferenceCount() CONST; protected: VOID Add(REFERENCE* Reference); VOID Remove(REFERENCE* Reference); REFERENCE* FirstReference; REFERENCE* LastReference; INT ReferenceCount; int Data; friend class REFERENCE; }; //+----------------------------------------------------------------------------- //| Post-included files //+----------------------------------------------------------------------------- #include "Reference.h" //+----------------------------------------------------------------------------- //| Constructor //+----------------------------------------------------------------------------- REFERENCE_OBJECT::REFERENCE_OBJECT() { FirstReference = NULL; LastReference = NULL; ReferenceCount = 0; } //+----------------------------------------------------------------------------- //| Copy constructor //+----------------------------------------------------------------------------- REFERENCE_OBJECT::REFERENCE_OBJECT(CONST REFERENCE_OBJECT& CopyObject) { FirstReference = NULL; LastReference = NULL; ReferenceCount = 0; } //+----------------------------------------------------------------------------- //| Destructor //+----------------------------------------------------------------------------- REFERENCE_OBJECT::~REFERENCE_OBJECT() { Clear(); } //+----------------------------------------------------------------------------- //| Assignment operator //+----------------------------------------------------------------------------- CONST REFERENCE_OBJECT& REFERENCE_OBJECT::operator =(CONST REFERENCE_OBJECT& CopyObject) { FirstReference = NULL; LastReference = NULL; ReferenceCount = 0; return (*this); } //+----------------------------------------------------------------------------- //| Clears all attached references //+----------------------------------------------------------------------------- VOID REFERENCE_OBJECT::Clear() { REFERENCE* CurrentReference; REFERENCE* NextReference; CurrentReference = FirstReference; while(CurrentReference != NULL) { NextReference = CurrentReference->NextReference; CurrentReference->ReferenceObject = NULL; CurrentReference->NextReference = NULL; CurrentReference->PreviousReference = NULL; CurrentReference = NextReference; } FirstReference = NULL; LastReference = NULL; ReferenceCount = 0; } //+----------------------------------------------------------------------------- //| Sets a new data //+----------------------------------------------------------------------------- VOID REFERENCE_OBJECT::SetData(int NewData) { Data = NewData; } //+----------------------------------------------------------------------------- //| Returns the data //+----------------------------------------------------------------------------- int REFERENCE_OBJECT::GetData() CONST { return Data; } //+----------------------------------------------------------------------------- //| Returns the first reference //+----------------------------------------------------------------------------- REFERENCE* REFERENCE_OBJECT::GetFirstReference() CONST { return FirstReference; } //+----------------------------------------------------------------------------- //| Returns the last reference //+----------------------------------------------------------------------------- REFERENCE* REFERENCE_OBJECT::GetLastReference() CONST { return LastReference; } //+----------------------------------------------------------------------------- //| Returns the next reference //+----------------------------------------------------------------------------- REFERENCE* REFERENCE_OBJECT::GetNextReference(REFERENCE* Reference) CONST { if(Reference == NULL) return NULL; return Reference->NextReference; } //+----------------------------------------------------------------------------- //| Returns the previous reference //+----------------------------------------------------------------------------- REFERENCE* REFERENCE_OBJECT::GetPreviousReference(REFERENCE* Reference) CONST { if(Reference == NULL) return NULL; return Reference->PreviousReference; } //+----------------------------------------------------------------------------- //| Returns the reference counter //+----------------------------------------------------------------------------- INT REFERENCE_OBJECT::GetReferenceCount() CONST { return ReferenceCount; } //+----------------------------------------------------------------------------- //| Adds a reference to the reference object //+----------------------------------------------------------------------------- VOID REFERENCE_OBJECT::Add(REFERENCE* Reference) { Reference->NextReference = NULL; Reference->PreviousReference = LastReference; if(FirstReference == NULL) FirstReference = Reference; if(LastReference != NULL) LastReference->NextReference = Reference; LastReference = Reference; ReferenceCount++; } //+----------------------------------------------------------------------------- //| Removes a reference from the reference object //+----------------------------------------------------------------------------- VOID REFERENCE_OBJECT::Remove(REFERENCE* Reference) { if(Reference->NextReference == NULL) { if(Reference->PreviousReference == NULL) { FirstReference = NULL; LastReference = NULL; } else { LastReference = Reference->PreviousReference; LastReference->NextReference = NULL; } } else { if(Reference->PreviousReference == NULL) { FirstReference = Reference->NextReference; FirstReference->PreviousReference = NULL; } else { Reference->PreviousReference->NextReference = Reference->NextReference; Reference->NextReference->PreviousReference = Reference->PreviousReference; } } ReferenceCount--; } //+----------------------------------------------------------------------------- //| End of inclusion guard //+----------------------------------------------------------------------------- #endif
starwars机器人#2 · 2010/10/9
然后是类REFERENCE,这个类利用了类REFERENCE_OBJECT的功能。 现在卡在这里了,搞不清类REFERENCE的功能 //+----------------------------------------------------------------------------- //| Inclusion guard //+----------------------------------------------------------------------------- #ifndef MAGOS_REFERENCE_H #define MAGOS_REFERENCE_H //+----------------------------------------------------------------------------- //| Included files //+----------------------------------------------------------------------------- #include "ReferenceObject.h" //+----------------------------------------------------------------------------- //| Reference class //+----------------------------------------------------------------------------- class REFERENCE { public: REFERENCE(); REFERENCE(CONST REFERENCE& CopyObject); virtual ~REFERENCE(); CONST REFERENCE& operator =(CONST REFERENCE& CopyObject); VOID SetData(int NewData); int GetData() CONST; int GetObjectData() CONST; VOID Attach(REFERENCE_OBJECT& NewReferenceObject); VOID Detach(); BOOL IsAttached() CONST; protected: REFERENCE_OBJECT* ReferenceObject; REFERENCE* NextReference; REFERENCE* PreviousReference; int Data; friend class REFERENCE_OBJECT; }; //+----------------------------------------------------------------------------- //| Constructor //+----------------------------------------------------------------------------- REFERENCE::REFERENCE() { ReferenceObject = NULL; NextReference = NULL; PreviousReference = NULL; } //+----------------------------------------------------------------------------- //| Copy constructor //+----------------------------------------------------------------------------- REFERENCE::REFERENCE(CONST REFERENCE& CopyObject) { ReferenceObject = NULL; NextReference = NULL; PreviousReference = NULL; if(CopyObject.IsAttached()) { Attach(*CopyObject.GetObjectData()); } } //+----------------------------------------------------------------------------- //| Destructor //+----------------------------------------------------------------------------- REFERENCE::~REFERENCE() { Detach(); } //+----------------------------------------------------------------------------- //| Assignment operator //+----------------------------------------------------------------------------- CONST REFERENCE& REFERENCE::operator =(CONST REFERENCE& CopyObject) { Detach(); if(CopyObject.IsAttached()) Attach(*CopyObject.ReferenceObject); return (*this); } //+----------------------------------------------------------------------------- //| Sets a new data //+----------------------------------------------------------------------------- VOID REFERENCE::SetData(int NewData) { Data = NewData; } //+----------------------------------------------------------------------------- //| Returns the data //+----------------------------------------------------------------------------- int REFERENCE::GetData() CONST { return Data; } //+----------------------------------------------------------------------------- //| Returns the object data //+----------------------------------------------------------------------------- int REFERENCE::GetObjectData() CONST { return ReferenceObject->GetData(); } //+----------------------------------------------------------------------------- //| Attaches the reference to a reference object //+----------------------------------------------------------------------------- VOID REFERENCE::Attach(REFERENCE_OBJECT& NewReferenceObject) { Detach(); ReferenceObject = &NewReferenceObject; ReferenceObject->Add(this); } //+----------------------------------------------------------------------------- //| Detaches the reference from its reference object //+----------------------------------------------------------------------------- VOID REFERENCE::Detach() { if(ReferenceObject != NULL) { ReferenceObject->Remove(this); ReferenceObject = NULL; } NextReference = NULL; PreviousReference = NULL; } //+----------------------------------------------------------------------------- //| Checks if the reference is attached //+----------------------------------------------------------------------------- BOOL REFERENCE::IsAttached() CONST { return (ReferenceObject != NULL); } //+----------------------------------------------------------------------------- //| End of inclusion guard //+----------------------------------------------------------------------------- #endif
FadeToBlack机器人#3 · 2010/10/9
google share_ptr
starwars机器人#4 · 2010/10/9
这和智能指针(share_ptr)没有关系的 我知道在算法中,Reference类是为了实现节点和节点之间逻辑关系的 我迷惑在实现什么样子的逻辑关系,以及如何实现 Reference类短短几个函数就封装好了 【 在 FadeToBlack 的大作中提到: 】 : google share_ptr