What if one can''t wrap the local in an artificial block?
A: Mostly time, one can limit the lifetime of a local via wrapping the local in an artificial block ({...}). But if for some cause you can''t do that, add a member function which has a similar effect as the destructor. Although do not call the destructor itself!
For instance, in the case of class File, you may add a close() method. The destructor typically will simply call this close() method. Note down that the close() method will have to mark the File object so a subsequent call won''t re-close an already-closed File. For example it might set the fileHandle_ data member to some nonsensical value like -1, and it may check at the starting to see if the fileHandle_ is already equal to -1:
class File {
public:
void close();
~File();
... private:
int fileHandle_; // fileHandle_ >= 0 if/only-if it''s open
};
File::~File()
{
close();
}
void File::close()
{
if (fileHandle_ >= 0) {
...insert code to call the OS to close the file... fileHandle_ = -1;
}
}
Note down that the other File methods might also have to check if the fileHandle_ is -1 (that mean., check if the File is closed).
Note down also that any constructors that don''t actually open a file should set fileHandle_ to -1.