原帖由 catmonkey_lee 于 2008-4-23 16:32 发表
但是用sizeof来看string对象的话,占用内存为4字节,和char *一样阿?
而且如果string 的拷贝构造实现基础只是引用计数加一的话,那么也不用完全拷贝字符串阿?
所以我还是觉得string可以 几乎 完全替代char ...
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(); } |
原帖由 mars_man 于 2008-5-2 03:06 发表
为了避免各种麻烦,容器里建议只用来容纳对象,对象才是自我完整的,自己对自己负责,否则在容器中采用一些原始的类型的话,麻烦会经常光顾的。
原帖由 wwwsq 于 2008-5-3 13:28 发表
"多线程中间,当你需要删除掉容器里面的这个对象, 你需要保证没有线程正在使用这个对象"
首先,会出现这种情况,说明这个程序的架构设计有问题。
其次,真有这种情况,也可以用删除队列来解决(我们维护老 ...
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |