codecomplexity

	// 1.invokes the Employee copy constructor. This copy operation might throw an exception
String EvaluateSalaryAndReturnName(Employee e) 
{	
	// 2.The Title() member function might itself throw, or it might return an object of class type by value, 
	//   and that copy operation might throw.
	// 3.To match a valid operator==(), the string literal may need to be converted to a temporary object of class type
	// 4.If operator==() is a programmer-supplied function, it might throw.
	if(e.Title() == "CEO" || e.Salary() > 100000)	
	{
	// 5.As documented in the C++ Standard, any of the five calls to operator<< might throw.
		cout << e.First() << " " << e.Last() << " is overpaid" << endl;		
	}	

	return e.First() + " " + e.Last();	
}

// exception-safe (works properly in the presence of exceptions) and exception-neutral (propagates all exceptions to the caller)

// think about the exception safe.
String EvaluateSalaryAndReturnName(Employee e)
{	
	String result = e.First() + " " + e.Last();
	
	if( e.Title() == "CEO" || e.Salary() > 100000 )			
	{		
		String message = result + " is overpaid\n";			
		cout << message;		
	}	
	
	return result;	
}

String theName;
theName = EvaluateSalaryAndReturnName( bob );
// The String copy constructor is invoked because the result is returned by value, 
// and the copy assignment operator is invoked to copy the result into theName. If either copy fails,
// then the function has completed its side effects (since the message was completely emitted and the return value was completely constructed), but the result has been irretrievably lost (oops).

void EvaluateSalaryAndReturnName(Employee e, string& r)
{
	String result = e.First() + " " + e.Last();
	
	if( e.Title() == "CEO" || e.Salary() > 100000 )			
	{		
		String message = result + " is overpaid\n";			
		cout << message;		
	}	
	
	r = result;
}
//This may look better, but it isn't, because the assignment to r might still fail, 
//which leaves us with one side effect complete and the other incomplete. 

// Attempt #3: Correct (finally!). 


//


auto_ptr<String> EvaluateSalaryAndReturnName(Employee e)
{
	auto_ptr<String> result = new String( e.First() + " " + e.Last() );
	if( e.Title() == "CEO" || e.Salary() > 100000 )		
	{	
		String message = (*result) + " is overpaid\n";	
		cout << message;				
	}	
	return result;  // rely on transfer of ownership;	
	// this can't throw		
}.  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章