A Complete Example: Class Person

 < Day Day Up > 



Class Person is a complete example that includes most of the class functionality described in this chapter. Notable exceptions are the lack of overloaded or private member functions. Person objects use dynamic memory allocation to hold string values for a person’s name. Because a person object dynamically allocates memory a person destructor must release the memory when a person object is destroyed. The Person class diagram is given in figure 11-10.

click to expand
Figure 11-10: Person Class Diagram

Example 11.19 gives the code for the person.h header file.

Listing 11.19: person.h

start example
 1  #ifndef  __Person_H  2  #define  __Person_H  3  4  5  class Person{  6       public:  7           Person(char*  _f_name = "John", char*  _m_name = "M",   8                  char* _l_name = "Doe", char _sex = 'M', int _age = 18);  9           ~Person(); 10           Person(Person&  person); 11           Person&operator=(Person& rhs); 12           void    setFirstName(char* f_name); 13           void    setMiddleName(char* m_name); 14           void    setLastName(char* l_name); 15           void    setAge(int age); 16           void    setSex(char sex); 17           char*   getFullName(); 18           char*   getFirstName(); 19           char*   getMiddleName(); 20           char*   getLastName(); 21           char    getSex(); 22           int     getAge(); 23 24       private:   25           char* f_name; 26           char* l_name; 27           char* m_name; 28           char sex; 29           int     age; 30           char*   full_name; 31           bool    name_changed; 32 33  }; 34  #endif
end example

Example 11.20 shows Person objects being created and used in a main() function.

Listing 11.20: main.cpp

start example
 1  #include <iostream>  2  #include "person.h"  3  using namespace std;   4  5  int main(){  6  7       Person p1;  8  9       cout<<p1.getFirstName()<<endl; 10       cout<<p1.getFullName()<<endl; 11       p1.setFirstName("Bob"); 12       p1.setMiddleName("Raymond"); 13       p1.setLastName("Basmahranian"); 14 15       cout<<p1.getFullName()<<" "<<p1.getAge()<<" "<<p1.getSex()<<endl; 16       cout<<p1.getFullName()<<" "<<p1.getAge()<<" "<<p1.getSex()<<endl; 17       cout<<p1.getFullName()<<" "<<p1.getAge()<<" "<<p1.getSex()<<endl; 18       cout<<p1.getFullName()<<" "<<p1.getAge()<<" "<<p1.getSex()<<endl; 19 20       Person p2(p1); 21 22       cout<<p1.getFullName()<<" "<<p1.getAge()<<" "<<p1.getSex()<<endl; 23       cout<<p2.getFullName()<<" "<<p2.getAge()<<" "<<p2.getSex()<<endl; 24       cout<<p2.getFullName()<<" "<<p2.getAge()<<" "<<p2.getSex()<<endl; 25 26       p2.setFirstName("Richard"); 27       p2.setMiddleName("Warren"); 28       p2.setLastName("Miller"); 29 30       cout<<p2.getFullName()<<" "<<p2.getAge()<<" "<<p2.getSex()<<endl; 31       cout<<p1.getFullName()<<" "<<p1.getAge()<<" "<<p1.getSex()<<endl; 32 33       Person p3; 34 35       p1=p3; 36 37       cout<<p1.getFullName()<<" "<<p1.getAge()<<" "<<p1.getSex()<<endl; 38       cout<<p2.getFullName()<<" "<<p2.getAge()<<" "<<p2.getSex()<<endl; 39       cout<<p3.getFullName()<<" "<<p3.getAge()<<" "<<p3.getSex()<<endl; 40 41       return 0; 42  }
end example

Example 11.21 gives the code for the person.cpp file. Showing the use of Person class objects after showing the class declaration emphasizes the fact that to use an object requires knowledge of its interface only, not its implementation.

Listing 11.21: person.cpp

start example
  1  #include"person.h"   2  #include"person.h"   3  #include <string.h>   4   5  Person::Person( char*  _f_name, char*  _m_name, char* _l_name, char _sex, int _age    6  ):sex(_sex),    7                  age(_age), name_changed(true), full_name(NULL){   8       f_name = new char[strlen(_f_name)+1];   9       strcpy(f_name, _f_name);  10  11       m_name = new char[strlen(_m_name)+1];  12       strcpy(m_name, _m_name);  13  14       l_name = new char[strlen(_l_name)+1];  15       strcpy(l_name, _l_name);  16  17  }  18  19  Person::~Person(){  20     delete[] f_name;  21     delete[] m_name;  22     delete[] l_name;  23     delete[] full_name;  24  }  25  26  Person::Person(Person&  person):name_changed(true), full_name(NULL){  27       f_name = new char[strlen(person.f_name)+1];  28       strcpy(f_name, person.f_name);  29  30       m_name = new char[strlen(person.m_name)+1];  31       strcpy(m_name, person.m_name);  32  33       l_name = new char[strlen(person.l_name)+1];  34       strcpy(l_name, person.l_name);  35  36       sex = person.sex;  37       age = person.age;  38  39  }  40  41  Person& Person::operator=( Person& rhs ){  42       delete[] f_name;  43      f_name = new char[strlen(rhs.f_name)+1];  44       strcpy(f_name, rhs.f_name);  45  46       delete[] m_name;  47       m_name = new char[strlen(rhs.m_name)+1];  48       strcpy(m_name, rhs.m_name);  49  50       delete[] l_name;  51       l_name = new char[strlen(rhs.l_name)+1];  52       strcpy(l_name, rhs.l_name);  53  54       name_changed = true;  55  56       return *this;  57  58  }  59  60  void Person::setFirstName(char* f_name){  61       delete[] this->f_name;  62        this->f_name = new char[strlen(f_name)+1];  63       strcpy(this->f_name, f_name);  64  65       name_changed = true;  66  67  }  68  69  void Person::setMiddleName(char* m_name){  70       delete[] this->m_name;  71        this->m_name = new char[strlen(m_name)+1];  72       strcpy(this->m_name, m_name);  73  74       name_changed = true;  75  76  }  77  void Person::setLastName(char* l_name){  78       delete[] this->l_name;  79        this->l_name = new char[strlen(l_name)+1];  80       strcpy(this->l_name, l_name);  81  82       name_changed = true;  83  }  84  85  void Person::setAge( int age ){  86           this->age = age;  87  }  88  89  90  void Person::setSex( char sex ){  91        this->sex = sex;  92  }  93  94  char* Person::getFullName(){  95  96       if((full_name != NULL) && (!name_changed))  97           return full_name;  98          else {  99 100               delete[] full_name; 101               full_name = new char[(strlen(f_name)  + strlen(m_name) 102                               + strlen(l_name) + 7)]; 103 104               strcpy(full_name, f_name); 105               strcat(full_name, " "); 106               strcat(full_name, m_name); 107               strcat(full_name, " "); 108               strcat(full_name, l_name); 109 110               name_changed = false; 111               return full_name; 112       } 113 114 115  } 116 117  char* Person::getFirstName(){ return f_name;} 118 119 120  char* Person::getMiddleName(){ return m_name;} 121 122 123  char* Person::getLastName(){ return l_name;} 124 125 126  char Person::getSex(){ return sex;} 127 128 129  int Person::getAge(){ return age;}
end example



 < Day Day Up > 



C++ for Artists. The Art, Philosophy, and Science of Object-Oriented Programming
C++ For Artists: The Art, Philosophy, And Science Of Object-Oriented Programming
ISBN: 1932504028
EAN: 2147483647
Year: 2003
Pages: 340
Authors: Rick Miller

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net