Composition & Friend Class & Pointer to object

أنشِئ Class :

اسمه: Job

المتغيرات : role , salary , id .

 

أنشِئ Class :

اسمه: Person

المتغيرات : Job  object  وهي عبارة عن”Composition “has-a relationship.

يحوي : Print Salary function تقوم بطباعة الراتب بدون get function .

-أجعل Person Class friend لـ Job class .

في main function :

* أنشِئ  Job & Person وأطبع الـ Salary باستخدام Person Object .

-أكتب ترتيب مناداة الـ Destructors للـ objects بمعنى آخر أي الـ objects تم تدميره أولًا .

-قم بفصل الـ Class interface  في header file و Class implementation في cpp file

الحل:

//Job.h
#include <iostream>
#include <string>
using namespace std;
class Job
{
private:
 string role;
 float salary;
 int id;

public:
 Job();
 ~Job();//destructor 

 string getRole()const;
 void setRole(string Role);

 float getSalary()const;
 void setSalary(float Salary);

 int getId()const;
 void setId(int ID);

 friend class Person; //friend class
};
------------------------------------------------
//Job.cpp
#include "Job.h"

Job::Job(){ role = " "; salary = 0; id = 0; }
Job::~Job(){ cout << "Job has been destructed\n\n"; } //destructor 

string Job::getRole()const { return role; }
void Job::setRole(string Role){ role = Role; }

float Job::getSalary()const{ return salary;}
void Job::setSalary(float Salary) { salary = Salary; }

int Job::getId()const{ return id; }
void Job::setId(int ID) { id = ID; }
-----------------------------------------------
//Person.h
#include "Job.h" //Must Include
class Person {

private:
 Job job; //composition has-a relationship


public:
 Person(const Job& myjob); //Copy Constructor 
 ~Person(); //destructor 
 void printSalary();
};

--------------------------------------------------
//Person.cpp
#include "Person.h"

Person::Person(const Job & myjob)
{
 job.salary = myjob.salary; 
 job.id = myjob.id;
 job.role = myjob.role;
}

Person::~Person(){ cout << "\nPerson has been destructed\n"; }//destructor 

void Person::printSalary()
{
 //Person can access a private data member of job class because it's friend

 cout << "The Salary is: " <<job.salary <<endl;
}
---------------------------------------------
//Main.cpp
#include <iostream>
#include <string>
#include "Person.h"

using namespace std;

void main()
{
 Job job;

 job.setRole("maneger");
 job.setId(4333200);
 job.setSalary(30000);

 Person *person = new Person(job); //Pointer to Person object

 person->printSalary();

 delete person; //to trace the destructor operation 

 system("pause");
}

السطر 25 : طريقة الـ class friend .

السطر 48 : Object Data Member .

السطر 74 : يستطيع Person الوصول للـ Private Data Memeber لـ Job لأنه Friend بدون الحاجة للـ Get Function .

السطر 92  : طريقة إنشاء Pointer to object .

السطر 94 : طريقة مناداة الـ pointer للـ function عن طريق Arrow “->” بدل “.” 

Advertisements

Pointer data member

أنشِئ Class :

اسمه:  Fraction

المتغيرات : *numerator و  denominator

:يحوي   Parameterized constructor  و Copy constructor و Default constructor

قم بفصل الـ Class interface  في header file و Class implementation في cpp file

لهدف من السؤال هو كيفية التعامل مع الـ pointer في constructors , destructor , set & get  .

الحل:

//.h
class Fraction
{
 int *numerator; //pointer data member
 int denominator;

public:

 Fraction(); //Default constructor
 Fraction(int, int);//Parameterized constructor 
 Fraction(const Fraction &);// Copy constructor 
 ~Fraction();//destructor

 void setNumerator(int);
 void setDenominator(int);

 int getDenominator();
 int getNumerator();

};
------------------------------------------------------
//.cpp
#include <iostream>
#include "Fraction.h"
using namespace std;

//Default constructor
Fraction::Fraction()
{
 numerator = new int; //allocate pointer
 if (!numerator) { cout << "Allocation failure"; exit(1); } //if not allocate
 //initialize
 setNumerator(1);
 setDenominator(1);
}

//Parameterized constructor
Fraction::Fraction(int N, int D)
{
 setNumerator(N); setDenominator(D);
}

//Copy constructor
Fraction::Fraction(const Fraction &obj)
{ numerator = new int; //allocate the pointer for the new object 
if (!numerator) { cout << "Allocation failure"; exit(1); } //if not allocte

//copy information
setNumerator(*obj.numerator); //use '*' to copy the value 
setDenominator(obj.denominator); }

//destructor
Fraction::~Fraction()
{ delete numerator; //delete pointer
}

void Fraction::setNumerator(int num)
{//use '*'
 *numerator = num; 
}
void Fraction::setDenominator(int num){ denominator = num; }

int Fraction::getDenominator(){ return denominator; }

int Fraction::getNumerator()
{ //use '*'
 return *numerator; 
}

Letter Counter Class

-أنشِئ “Class “Letter_Counter يحوي :

    Data Member : Counter

 (  Member Function : int letter_counting(char * s1,char letter 

هذه الـ function تستقبل جملة و حرف وتقوم بحساب عدد المرّات الذي ظهر فيها الحرف في الجملة ثم تقوم بعمل return لعدد المرّات.

 الجملة والحرف يجب قراءتها من المستخدم ، ويجب استخدام الـpointer في letter counting function.

الحل:

في الحل تم اختيار 40 حرف كحد أقصى لعدد حروف الجملة ، بإمكانك اختيار عدد اخر.

 

#include <iostream>
using namespace std;

class letter_count
{
//private by default

//Data members
 int counter;

public:
//Member functions

//Constructor and destructor
 letter_count(){ counter = 0; }
 ~letter_count(){}

//set and get
 void setcount(int c){ counter = c; }
 int getcount(){ return counter; }

//letter counting function
 int letter_counting(char * s1, char letter)

 { //s1 is the sentence
 for (; *s1 != 0; s1++)
 if (*s1 == letter) { counter++; }
 return counter;
 }
};

void main()
{
 char sentance[40];
 char letter;

 letter_count obj;

 cout << "Enter a sentance with 40 letters maximum: ";
 cin.getline(sentance, 40);

 cout << "Enter a letter: ";
 cin >> letter;

 cout << "The number of Letter '" << letter << "' appers in your sentance is: " << obj.letter_counting(sentance, letter) << endl;

 system("pause");
}

استخدام الـ pointer لقراءة الـ Array

-أكتب برنامج يقرأ من المستخدم سلسلة من char وأحفظها داخل Array ،ثم أطبع محتوى الـ Array كاملًا ولكن قم بتغيير كل vowel letter وضع في مكانه – ، وأخيرًا أطبع عدد الـ vowel letters التي في السلسلة . أستخدم الـ pointer للمرور على محتوى الـ Array.

الحل:

#include <iostream>
using namespace std;

void main()
{
  char ar[20];
  char *ptr = ar;
  int i = 0;

  cout << "Enter a list of characters ";
  cin >> ar;

 for (; *ptr != '\0'; ptr++)
 {
     if (*ptr == 'a' || *ptr == 'u' || *ptr == 'i' || *ptr == 'e' || *ptr == 'o')
    {
       *ptr = '_';
      i++;
    }//end if
 }//end for


 cout << "There are " << i << " vowel letters" << endl;
 cout << ar << endl; //print the array content

 system("pause");

}