如果一个类A的构造函数中,有需要动态分配内存的数据,那么就使用一个单独的类P来封装这些指针数据,因为不这样做的话,如果A的构造函数发生异常的话,那些已经分配了内存的对象将无法被回收。倘若我们使用P来把这些数据封装起来,不论A发生异常与否,P的析构函数都会被执行,它将释放封装在它内部的指针数据的内存。
这可以用商人的思想来理解:比如做水果生意的商人,他们并不关心农民是如何生产水果的,他们只关心市场上是否有他们所要的产品。如果市场上没有他们所要的产品,那么农民那里肯定是有异常了,可能遇洪水了,可能遇虫害了,等等。可能你会说,市场上也许本来就没有这个产品呢,你说我会不会怀疑那个商人是不是一个合格的商人呢?呵呵。所以,农民将承担起生产水果的责任。
我们假设水果商的目标是:5吨苹果,6吨香蕉。可是农民并没有生产出这么多的水果,而在他的目标日记上已经记录下这一数据,那他就有必要把这一个数据擦除掉。我们可以定义一个农民的类,它负责把释放水果资源。~~~表达能力太差了。。~~写个程序出来吧:
#include <iostream>
using namespace std;
typedef int TApple;
typedef char TTomato;
//////////////////////////////////////////////////
//
// class Farmer
class Farmer
{
public:
Farmer( TApple a, TTomato t );
~Farmer( );
private:
TApple * _applePtr;
TTomato * _tomatoPtr;
};
Farmer::Farmer( TApple a, TTomato t )
{
_applePtr = new TApple( a );
_tomatoPtr = new TTomato( t );
}
Farmer::~Farmer( )
{
if ( !_applePtr )
delete _applePtr;
if ( !_tomatoPtr )
delete _tomatoPtr;
cout << "Farmer is the best!" << endl;
}
/////////////////////////////////////////////////////
//
// enum ERisk
enum ERisk
{
eNone,
eFlood,
ePest,
eOther
};
/////////////////////////////////////////////////////////////
//
// class Trader
class Trader
{
public:
Trader( TApple a, TTomato t, ERisk r = eNone );
private:
Farmer _farmer;
};
Trader::Trader( TApple a, TTomato t, ERisk r ) : _farmer( a, t )
{
// I will throw
switch ( r )
{
case eNone:
cout << "Good! The I have reached my target!" << std::endl;
break;
case eFlood:
throw "Flood occured! I cannot do this business...\n";
break;
case ePest:
throw "Fuck! I hate the pest just like the wet weather.\n";
break;
case eOther:
throw "My God! I have never encountered this environment!\n";
break;
default:
break;
}
}
///////////////////////////////////////////
//
// main class
int main( )
{
try
{
Trader t1( 5, 6 );
}
catch ( char* e_string )
{
cout << e_string << endl;
}
try
{
Trader t2( 5, 6, eFlood);
}
catch ( char* e_string )
{
cout << e_string << endl;
}
try
{
Trader t3( 5, 6, ePest );
}
catch ( char* e_string )
{
cout << e_string << endl;
}
try
{
Trader t4( 5, 6, eOther );
}
catch ( char* e_string )
{
cout << e_string << endl;
}
return 0;
}
无语,这里好像不能上传图片~~~~老提示silverlight错误~~~