| A class Resource and its application in the function use_resource - compilable version. | Lecture 3 - slide 11 : 36 Program 2  | 
// A complete version that can be used to illustrate what happens in case of exceptions after resource allocation. 
// This version reveals the resource allocation and deallocation on standard output. 
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
typedef string resource_id_t;
typedef int resource_type;
class Problem{};
class Resource{
private:
  resource_type r;
  resource_id_t rti;
  
public:
  Resource(resource_id_t id): r(allocate_resource(id)), rti(id){
  }
  ~Resource() {
    release_resource(rti);
  }
  
private:
  resource_type allocate_resource(resource_id_t id){
    cout << "Allocate resource: " << id << endl;
    return 1;
  }
  void release_resource(resource_id_t id){
    r = 0;
    cout << flush << "Release resource: " << id << flush << endl;
  }
};
void use_resource(resource_id_t r, bool problem_condition){
  Resource res(r);         // The constructor allocates the resource
  cout << "Use Resource" << endl;
  if (problem_condition){
    cout << "An exception is thrown" << endl;
    throw Problem();
  }
  // When the functions ends, or if an exception occurs before that,
  // the Resource destructor will be activated hereby relinquising it.
};
int main(int argc, char *argv[]){
  bool problem_condition = (argc >= 2) && (std::strcmp(argv[1],"problem") == 0);
  if (problem_condition) 
     cout << "The program will throw and exception during use of resource" << endl;
  else
     cout << "The program will use resource without throwing an exception" << endl;
  try{
    use_resource("sample_resource", problem_condition);
  }
  catch(Problem){
    cout << "Recovering" << endl;
  }
}