|

楼主 |
发表于 2009-11-19 12:13:00
|
显示全部楼层
Re: 如何保证一个对象最先构造,最后析构?
bluebaby9811: 如何保证一个对象最先构造,最后析构?
这是我在百度知道上的问题:
程序中有一个对象是其它对象必需依赖的,如何保证...
新发现,程序如下:
//支持者
class CSupporter
{
public:
CSupporter()
{
if(NULL==m_pData)m_pData=new Data;
else m_pData->AddUser();
}
~CSupporter()
{
if(NULL!=m_pData&&0==m_pData->DecUser())
{
delete m_pData;
m_pData=NULL;
}
}
CSupporter(const CSupporter& src){if(NULL!=m_pData)m_pData->AddUser();}
CSupporter& operator=(const CSupporter& src){return *this;}
private:
struct Data
{
long m_UserCount;
//这里可以添加其它数据
Data():m_UserCount(1){cout<<"构造支持者"<<(unsigned long)this<<"!"<<endl;}
~Data(){cout<<"析构支持者"<<(unsigned long)this<<"!"<<endl;}
void AddUser(){++m_UserCount;}
long DecUser(){return --m_UserCount;}
};
static Data* m_pData;
};
CSupporter: ata* CSupporter::m_pData=NULL;
class CA
{
public:
CA(){cout<<"构造CA对象"<<(unsigned long)this<<"!"<<endl;}
~CA(){cout<<"析构CA对象"<<(unsigned long)this<<"!"<<endl;}
private:
CSupporter m_Supporter;
};
class CB
{
public:
CB(){cout<<"构造CB对象"<<(unsigned long)this<<"!"<<endl;}
~CB(){cout<<"析构CB对象"<<(unsigned long)this<<"!"<<endl;}
private:
CSupporter m_Supporter;
};
class CC
{
public:
CC(){cout<<"构造CC对象"<<(unsigned long)this<<"!"<<endl;}
~CC(){cout<<"析构CC对象"<<(unsigned long)this<<"!"<<endl;}
private:
CSupporter m_Supporter;
};
class CD
{
public:
CD(){cout<<"构造CD对象"<<(unsigned long)this<<"!"<<endl;}
~CD(){cout<<"析构CD对象"<<(unsigned long)this<<"!"<<endl;}
private:
CSupporter m_Supporter;
};
//测试用例
int main()
{
CA a1, a2;
CB b1, b2;
CD d1, d2;
CC c1, c2;
return 0;
}
因为构造用户类对象时,CSupporter类的构造函数也会被调用,所以用户类的构造函数中就不需要CSupporter类对象的引用作为其参数了。当构造第一个用户类对象时,CSupporter类对象就会正确构造并使引用计数为1,接下来构造其它用户类对象时,只是使引用计数增加,这也是符合原语义的,增加一个用户类对象,就增加一份引用,减少一个用户类对象,就减少一份引用,这很好理解吧。我想这正是C++的高明之处吧!尽量使程序意思与原语义相符。运行结果如下: |
|