晓寒
2013-1-16 20:17:00
阅读(1170)
hpho2013-1-17 23:05:00
re: 基础库___智能指针
1, 两个宏都少了继行符'\'
2, CHSmartPointer<const Self>会使得
CHSmartPointer::m_Pointer;是const的但
明显Self::Register()和Self::UnRegister()都不是
const修饰的, 那么CHSmartPointer::Register()和
CHSmartPointer::UnRegister()不会错吗??
3, CHObject::GetNameOfClass()竟然是static的?
那
class D: public CHObject;
CHObject pBase=new D();
pBase->GetNameOfClass();//怎样也表现不出RIIT.
4,
CHTestObject test;
CHTestObject::Pointer p;
p=&test;
这样怎解决:-P
晓寒2013-1-17 23:05:00
3ks hpho 的热情。
1、有序行符的,但是网页不知道为何没有表达出来。
2、又两个,一个是常量的一个不是。
typedef CHSmartPointer<Self> Pointer;
typedef CHSmartPointer<const Self> ConstPointer;
3、 直接使用new是不可以的。因为我必须要求所有的派生内都是用宏: CHObjectDefine(type),这样如果需要实例化像我提供的例子那样:
CHTestObject::Pointer p;
p = CHTestObject::New();
4、我。。。。我没有想到这个样子的。呵呵。我回头想想。
hpho2013-1-17 23:05:00
re: 基础库___智能指针
第二点你还没明白我在说什么.
看看这个化简的CODE吧
template <class TObjectType>
class CHSmartPointer {
private:
/**//** 智能指针指向的原始指针. */
TObjectType* m_Pointer;
public:
void UnRegister()
{
if(m_Pointer) { m_Pointer->UnRegister(); }
}
};
class CHObject{
public:
typedef CHSmartPointer<const CHObject> ConstPointer;
void CHObject::UnRegister(){}
// 这个是void CHObject::UnRegister()const!!
};
int main()
{
CHObject::ConstPointer p;
p.UnRegister(); // error!!
//因为m_Pointer是const CHObject*
return 0;
}
晓寒2013-1-17 23:05:00
_-_!
收到。 我暂时没有好主意了。 能否提个修改建议。总不至于不支持常量指针吧?_-_!
hpho2013-1-17 23:05:00
re: 基础库___智能指针
方法是这样的:
1, 要把Object里引用部分抽出来, 假设此class定义为:
class RefCnt{
int count;
Object* obj;
public:
RefCnt(Object* po):obj(po){}
unreg(){...; delete obj;}
};
2, Object则为:
class Object{
RefCnt* pRefC;
public:
Object(){
pRefC=new RefCnt(this);
}
~Object(){delete pRefC;}
};
因为就算是const Object, pRefC也只是RefCnt* const, 所以就避开了Object的const. 还有就是这里的delete并不会引起递归!
现在的智能指针Point的operator()->就可以用RefCnt里的Object*, 问题是你怎样把Point和RefCnt建立关系!? 这里你自己想吧. (要注意RefCnt成员函数的访问权限应该只给Point哦, 这里可能要用友员!)
----------------------------
我发现你原来的CHObject::UnRegister();这些都是公有的. 那么
CHTestObject::Pointer p;
p = CHTestObject::New();
for(int i=0; i<10; ++i)
p->Register();
随便地修改了引用个数!
fastzhao2013-1-17 23:05:00
re: 基础库___智能指针
我觉得你不用哪个CHObject类了,那个类就实现了一个引用记数,而且迫使用户的类必须从你这个类继承,才能建立smartpointer类。
我认为应该把引用记数放在smartpointer类中。
下面的代码是我模仿<c++沉思录>中的实现一个smartpointer:
#ifndef _SHAREPRT_H_
#define _SHAREPRT_H_
template<typename T>
class SharePtr;
template<typename T>
bool operator< (const SharePtr<T>& Lop,const SharePtr<T>& Rop);
template<typename T>
bool operator== (const SharePtr<T>& Lop,const SharePtr<T>& Rop);
template<typename T>
class SharePtr
{
friend bool operator< <T> (const SharePtr& Lop, const SharePtr& Rop);
friend bool operator== <T> (const SharePtr& Lop,const SharePtr& Rop);
T* pSurrogateObj; //代理的类
int* useCount; //引用记数,这里用指针是因为所有的代理类只有一个引用记数
CRITICAL_SECTION* m_lockSharePtr;
public:
//int getCount(){return *useCount;}
SharePtr(T* pObj = NULL): useCount(new int(1)), pSurrogateObj(pObj)
{
//TRACE("useCount create:%d\n", *useCount);
m_lockSharePtr = new CRITICAL_SECTION;
InitializeCriticalSection(m_lockSharePtr);
}
~SharePtr(void)
{
EnterCriticalSection(m_lockSharePtr);
//TRACE("useCount realese:%d\n", *useCount);
if(--(*useCount) == 0)
{
delete useCount;
delete pSurrogateObj;
LeaveCriticalSection(m_lockSharePtr);
DeleteCriticalSection(m_lockSharePtr);
delete m_lockSharePtr;
//TRACE("User Conn close!\n");
}
else
{
LeaveCriticalSection(m_lockSharePtr);
}
}
SharePtr(const SharePtr& ref): useCount(ref.useCount), pSurrogateObj(ref.pSurrogateObj)
{
m_lockSharePtr = ref.m_lockSharePtr;
EnterCriticalSection(m_lockSharePtr);
if(pSurrogateObj != NULL)
{
++(*useCount);
//TRACE("useCount copy constuct: %d\n", *useCount);
}
LeaveCriticalSection(m_lockSharePtr);
}
SharePtr& operator= (const SharePtr& ref)
{
EnterCriticalSection(m_lockSharePtr);
if(this != &ref)
{
if(--(*useCount) == 0)
{
delete useCount;
delete pSurrogateObj;
}
useCount = ref.useCount;
pSurrogateObj = ref.pSurrogateObj;
if(pSurrogateObj != NULL)
++(*useCount);
//TRACE("useCount operator==: %d\n", *useCount);
}
LeaveCriticalSection(m_lockSharePtr);
return *this;
}
T& operator*()
{
return *pSurrogateObj;
}
T* operator->()
{
return pSurrogateObj;
}
T* RealPiont()
{
return pSurrogateObj;
}
bool IsNull()
{
return (pSurrogateObj == NULL);
}
/*void ReplaceObj(const SharePtr& ref)
{
//delete pSurrogateObj;
pSurrogateObj = ref.pSurrogateObj;
}*/
};
template<typename T>
bool operator< (const SharePtr<T>& Lop, const SharePtr<T>& Rop)
{
return (*Lop.pSurrogateObj < *Rop.pSurrogateObj);
}
template<typename T>
bool operator== (const SharePtr<T>& Lop, const SharePtr<T>& Rop)
{
return (*Lop.pSurrogateObj == *Rop.pSurrogateObj);
}
#endif
Zhuyie2013-1-17 23:05:00
re: 基础库___智能指针
限制太死,boost中的智能指针类很好用。