Item 15 - Provide access to raw resources in resource-managing classes.
Item 13 introduces the idea of using smart pointers like auto_ptr or shared_ptr to hold the result of a call to a factory function like createInvestment:
std::shared_ptr<Investment> pInv (createInvestment());Suppose that a function you'd like to use when working with Investment objects is this:
int daysHeld(const Investment* pi); // return number of days investment has been heldYou'd like to call it like this
int days = daysHeld(pInv); // error!but the code won't compile: daysHeld wants a raw Investment* pointer, but you're passing an object of type shared_ptr<Investment>. You need a way to convert an object of the RAII class (in this case shared_ptr) into the raw resource it contains (e.g., the underlying Investment*). There are two general ways to do it: explicit conversion and implicit conversion. shared_ptr and auto_ptr both offer a get member function to perform an explicit conversion, i.e., to return (a copy of) the raw pointer inside the smart pointer object:
int days = daysHeld(pInv.get()); // fine, passes the raw pointer in pInv to daysHeldLike virtually all smart pointer classes shared_ptr and auto_ptr also overload the pointer dereferencing operators (-> and *), and this allows implicit conversion to the underlying raw pointers:
class Investment { // root class for a hierarchy of investment types
public:
bool isTaxFree() const;
...
};
Investment* createInvestment(); // factory function
shared_ptr<Investment> pi1(createInvestment()); // shared_ptr manage a resource
bool taxable1 = !(pi1->isTaxFree()); // access resource via operator->
...
auto_ptr<Investment> pi2(createInvestment()): // auto_ptr manage a resource
bool taxable2 = !((*pi2).isTaxFree()); // access resource via operator*Things to Remember
APIs often require access to raw resource, so each RAII class should offer a way to get to the resource it manages.
Access may be via explicit conversion or implicit conversion. In general, explicit conversion is safer, but implicit conversion is more convenient for clients.
Last updated