C++ Help on Class Design Exception Handling -
i'm learning c++ , practicing knowledge implementing simple addressbook application. i started entry
class , addressbook
class implements stl map access entries lastly names of persons. arrived @ next code:
entry addressbook::get_by_last_name(string last_name){ if(this->addr_map.count(last_name) != 0){ //what can here? } else { homecoming addr_map[last_name]; }
in scripting languages homecoming -1, error message
(a list in python) indicate function failed. don't want throw exception, because it's part of application logic. calling class should able react request printing on console or opening message box. thought implementing scripting languae approach in c++ introducing kind of invalid state class entry
. isn't bad practice in c++? whole class design not appropriate? appreciate help. please maintain in mind i'm still learning c++.
some quick notes code:
if(this->addr_map.count(last_name) != 0){ //what can here?
you wanted other way:
if(this->addr_map.count(last_name) == 0){ //handle error
but real problem lies here:
return addr_map[last_name];
two things note here:
theoperator[]
map can 2 things: if element exists, returns it; if element doesn't exist, creaets new (key,value) pair
specified key , value's default constructor
. not wanted. however, if if
statement before have been right way, latter never happen because knowthe key exists before hand. in calling count()
before, tell map
seek , find element. calling operator[]
, telling map
find again. so, you're doing twice work retrieve single value. a improve (faster) way involves iterators, , find
method:
yourmap::iterator = addr_map.find(last_name); //find element (once) if (it == addr_map.end()) //element not found { //handle error } homecoming *it.second; //return element
now, back problem @ hand. if last_name
not found? other answers noted:
boost::optional
. simply homecoming yourmap::iterator
seems trying "hide" map
user of addressbook
that's bad idea. throw
exception
. wait, you'll have first check calling method 'safe' (or handle exception
when appropriate). check requires boolean method lastnameexists
have called before calling get_by_last_name
. of course of study we'er square 1. we're performing 2 find operations retrieve single value. it's safe, if you're doing lot of calls get_by_last_name
potentially place optimize different solution (besides, arguably exception not constructive: what's wrong searching isn't there, huh?). create dummy
fellow member entry
indicating not real entry
poor design (unmanageable, counter intuitive, wasteful - name it). as can see, first 2 solutions far preferable.
c++ class exception design exception-handling
No comments:
Post a Comment