返回信息流我在研究一个很大的算法,其中有一个类看不懂,搞不清楚这个类的功能。这个类的功能对于理解整个算法有至关重要的作用,所以我卡在这里了!!!
请大牛帮我研究一下,详见下面两个文件。每个文件定义一个类,内容很少的,麻烦看一下吧。
文件ReferenceObject.h定义了类ReferenceObject,这个类我研究明白了。其实类ReferenceObject实现了双向链表的功能。
但是文件Reference.h定义的类Reference没有弄明白,类Reference是利用类ReferenceObject实现其功能的。
附件(7.4KB) ReferenceObject.h
附件(4.5KB) Reference.h
这是一条镜像帖。来源:北邮人论坛 / cpp / #44576同步于 2010/10/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
求助大牛!Reference类到底要实现什么功能啊!??
starwars
2010/10/9镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
首先是类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
然后是类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
这和智能指针(share_ptr)没有关系的
我知道在算法中,Reference类是为了实现节点和节点之间逻辑关系的
我迷惑在实现什么样子的逻辑关系,以及如何实现
Reference类短短几个函数就封装好了
【 在 FadeToBlack 的大作中提到: 】
: google share_ptr