Exercise: Search a User By Lastname

Description

The original C implementation (download userdb.h, download userdb.cpp to search a user is by equality of her lastname:

struct User* userdb_search_by_lastname(struct UserDB*, char lastname[]);

As always, in C this can be done better: in class UserDB, implement a method

class UserDB
{
public:
    ...
    User search_by_lastname(const std::string& lastname) const;
    ...
};

search_by_lastname() returns the first user whose lastname is lastname. If there are multiple users with that name, the rest goes undetected.

Test this using the following program (feel free to use your own version of it):

#include "userdb.h"
#include <iostream>
#include <cassert>

int main()
{
    UserDB db;

    // setup db to have something to search for
    // ----------------------------------------
    db.insert(User("Philipp", "Lichtenberger", 35));
    db.insert(User("Joerg", "Faschingbauer", 55));
    db.insert(User("Caro", "Faschingbauer", 24));

    // test the search
    // ---------------

    // we find the *first* user if it exists
    User found = db.search_by_lastname("Faschingbauer");
    assert(found.firstname() == "Joerg");
    assert(found.lastname() == "Faschingbauer");
    assert(found.age() == 55);

    // lacking knowledge of exception handling, we have to return an
    // invalid user when none exists.
    User notfound = db.search_by_lastname("DoesNotExist");
    assert(!notfound.isvalid());

    return 0;
}

Dependencies

cluster_cxx03 C++ cluster_cxx03_standard_library_miscellanea The Standard Library: Miscellaneous Topics cluster_cxx03_exercises_userdb Exercises: User Database cluster_cxx03_functions_and_methods Functions and Methods cluster_cxx03_exceptions Exceptions cluster_cxx03_templates C++ Template Basics cluster_cxx03_data_encapsulation Data Encapsulation cluster_cxx03_stl Standard Template Library cluster_c The C Programming Language cluster_c_introduction Introduction cxx03_introduction Introduction c_introduction_installation Installation cxx03_introduction->c_introduction_installation cxx03_standard_library_miscellanea_string std::string cxx03_exercises_userdb_user_const_members Exercise: const Members cxx03_exercises_userdb_user_ctor Exercise: Transform struct User Into A Class cxx03_exercises_userdb_user_const_members->cxx03_exercises_userdb_user_ctor cxx03_data_encapsulation_ctor_dtor More Constructors, Destructors cxx03_exercises_userdb_user_const_members->cxx03_data_encapsulation_ctor_dtor cxx03_exercises_userdb_userdb_insert Exercise: Insert a User into UserDB cxx03_exercises_userdb_userdb_vector_basic Exercise: Use std::vector in UserDB cxx03_exercises_userdb_userdb_insert->cxx03_exercises_userdb_userdb_vector_basic cxx03_stl_basics Standard Template Library: Basics cxx03_exercises_userdb_userdb_insert->cxx03_stl_basics cxx03_exercises_userdb_user_const Exercise: Use const cxx03_exercises_userdb_user_access_methods Exercise: Access Methods for Members cxx03_exercises_userdb_user_const->cxx03_exercises_userdb_user_access_methods cxx03_functions_and_methods_references References cxx03_exercises_userdb_user_const->cxx03_functions_and_methods_references cxx03_exercises_userdb_user_ctor->cxx03_standard_library_miscellanea_string cxx03_data_encapsulation_ctor_custom Custom Constructor cxx03_exercises_userdb_user_ctor->cxx03_data_encapsulation_ctor_custom cxx03_exercises_userdb_user_simple_method Exercise: Simple Method (Users Age By n Years) cxx03_exercises_userdb_user_access_methods->cxx03_exercises_userdb_user_simple_method cxx03_functions_and_methods_methods Methods cxx03_exercises_userdb_user_access_methods->cxx03_functions_and_methods_methods cxx03_exercises_userdb_user_default_ctor Exercise: Default Constructor (was: Arrays of Objects) cxx03_exercises_userdb_userdb_vector_basic->cxx03_exercises_userdb_user_default_ctor cxx03_exercises_userdb_userdb_vector_basic->cxx03_stl_basics cxx03_exercises_userdb_user_default_ctor->cxx03_exercises_userdb_user_const cxx03_exercises_userdb_user_default_ctor->cxx03_data_encapsulation_ctor_dtor cxx03_exercises_userdb_userdb_search Exercise: Search a User By Lastname cxx03_exercises_userdb_userdb_search->cxx03_exercises_userdb_userdb_insert cxx03_exercises_userdb_user_simple_method->cxx03_exercises_userdb_user_const_members cxx03_exercises_userdb_user_simple_method->cxx03_functions_and_methods_methods cxx03_functions_and_methods_this this cxx03_functions_and_methods_this->cxx03_functions_and_methods_methods cxx03_functions_and_methods_overloading Overloading cxx03_functions_and_methods_methods->cxx03_functions_and_methods_overloading cxx03_data_encapsulation_classes_objects Classes and Objects cxx03_functions_and_methods_overloading->cxx03_data_encapsulation_classes_objects cxx03_functions_and_methods_references->cxx03_functions_and_methods_this cxx03_exceptions_basics Basics cxx03_exceptions_try_catch try - catch cxx03_exceptions_try_catch->cxx03_exceptions_basics cxx03_exceptions_try_catch->cxx03_data_encapsulation_classes_objects cxx03_templates_class_templates Class Templates cxx03_templates_function_templates Function Templates cxx03_templates_class_templates->cxx03_templates_function_templates cxx03_templates_function_templates->cxx03_exceptions_try_catch cxx03_data_encapsulation_ctor_dtor->cxx03_data_encapsulation_ctor_custom cxx03_data_encapsulation_ctor_default Default Constructor cxx03_data_encapsulation_ctor_dtor->cxx03_data_encapsulation_ctor_default cxx03_data_encapsulation_classes_objects->cxx03_introduction cxx03_data_encapsulation_c Object Oriented Programming In Good Ol’ C cxx03_data_encapsulation_classes_objects->cxx03_data_encapsulation_c cxx03_data_encapsulation_ctor_custom->cxx03_data_encapsulation_classes_objects cxx03_data_encapsulation_ctor_default->cxx03_data_encapsulation_ctor_custom cxx03_data_encapsulation_c->cxx03_introduction cxx03_stl_basics->cxx03_templates_class_templates