| < 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.
Figure 11-10: Person Class Diagram
Example 11.19 gives the code for the person.h header file.
Listing 11.19: person.h
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
Example 11.20 shows Person objects being created and used in a main() function.
Listing 11.20: main.cpp
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 }
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
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;}
| < Day Day Up > |
|