- 论坛徽章:
- 0
|
C++是不完美的,很多事情要自己处理。我不喜欢用模板。请注意这里的hold
class CObject : public virtual IObject
{
private:
int objref;
protected:
CObject() :
objref(0)
{
}
public:
virtual bool equals(const IObject *o) const
{
if (this == o)
return true;
return false;
}
virtual int hold(int refs)
{
refs += objref;
if (refs < 1)
{
destroy();
return refs;
}
return objref = refs;
}
virtual void destroy()
{
delete this;
}
public:
virtual ~CObject()
{
}
}; |
class CMap : public CObject, public virtual IMap
{
private:
IArray *array;
public:
virtual void clear()
{
array->clear();
}
virtual void add(IObject *o)
{
IPair *p = dynamic_cast<IPair *>(o);
if (0 == p)
throw new CException(new CString("add Pair only"));
array->add(o);
}
virtual void remove(IObject *o)
{
array->remove(o);
}
virtual int getCount() const
{
return array->getCount();
}
virtual int getSize() const
{
return array->getSize();
}
virtual void first()
{
array->first();
}
virtual bool hasMore()
{
return array->hasMore();
}
virtual IObject * next()
{
return array->next();
}
virtual void set(IObject *key, IObject *value)
{
if (array->getCount() < 1)
{
array->add(new CPair(key, value));
return;
}
IPair *p;
IObject *k;
int total = array->getSize();
for (int i = 0; i < total; i++)
{
p = dynamic_cast<IPair *>(array->get(i));
if (0 == p)
continue;
k = p->getKey();
if (0 == p)
continue;
if (k->equals(key))
{
array->set(i, new CPair(key, value));
return;
}
}
}
virtual IObject * get(IObject *key)
{
IPair *p;
IObject *k;
array->first();
while (array->hasMore())
{
p = dynamic_cast<IPair *>(array->next());
if (0 == p)
continue;
k = p->getKey();
if (0 == p)
continue;
if (k->equals(key))
return p->getValue();
}
return 0;
}
CMap(IArray *arr)
{
array = arr;
if (0 == array)
array = new CArray();
}
~CMap()
{
array->destroy();
} |
[ 本帖最后由 yuanchengjun 于 2008-5-2 09:49 编辑 ] |
|