본문 바로가기

Programming/C++ 3

[C++] 08-01. 객체 포인터의 참조관계 [급여관리 시스템 2단계]

반응형

객체의 주소 값을 저장 하는 객체 포인터 변수

 

"C++에서, AAA형 포인터 변수는 AAA 객체 또는 AAA를 직접 혹은 간접적으로 상속하는 모든 객체를 가리킬 수 있다."

 

즉, 객체의 주소 값을 저장할 수 있다

 

class Student : public Person
{
...
};

class PartTimeStudent : public Student
{
...
};

Person <- Student <- PartTimeStudent

Person *ptr = new Student();

Person *ptr = new PartTimeStudent();

Student *ptr= new PartTimeStudent();

더 큰 범주의 클래스에서 상속한 클래스를 포인터형으로 가리킬 수 있다.

그렇기 때문에, Person형 포인터라고 해도 가리키는 객체가 Person객체라고 단정지을 수 없다.

[Person형 포인터는 Person 객체 뿐 아니라, Person을 상속하는 모든 객체를 가리킬 수 있기 때문에]

 

 

유도 클래스 객체를 기초 클래스 객체로 바라볼 수 있는 근거

Student는 Person이다

PartTimeStudent는 Student이다

PartTimeStudent는 Person이다.

 


급여관리 시스템 -2단계

 

  • 고용인 Employee
  • 정규직 PermanentWorker
  • 영업직 SalesWorker
  • 임시직 TemporaryWorker

정규직, 영업직, 임시직 모두 고용의 한 형태 [모두 고용인]

영업직은 정규직의 일종 [기본 연봉 + 인센티브]

 

class ParmanentWorker : public Employee
class TemporaryWorker : public Employee

class SalesWorker : public PermanentWorker

모든 클래스의 객체를 Employee 객체로 간주할 수 있다.

즉, 컨트롤 클래스에서는 모든 객체를 Empoyee 객체로 간주한다.

따라서, EmployeeHandler에서 모든 클래스의 객체를 처리할 수 있다.


 

//EmployeeHandler.h
#ifndef EMPLOYEEHANDLER_H
#define EMPLOYEEHANDLER_H
#include "Employee.h"

class EmployeeHandler
{
private:
	Employee* empList[50]; //1단계에서 바뀐부분 //모든 객체를 Employee 객체를 가리킨다고 간주
	int empNum;
public:
	EmployeeHandler();
	void AddEmployee(Employee* emp); //1단계에서 바뀐부분
	void ShowAllSalaryInfo() const;
	void ShowTotalSalary() const;
	~EmployeeHandler();
};

#endif // !EMPLOYEEHANDLER_H

#pragma once
//EmployeeHandler.cpp
#include <iostream>
#include "Employee.h"
#include "EmployeeHandler.h"
using namespace std;

EmployeeHandler::EmployeeHandler()
	:empNum(0)
{

}
void EmployeeHandler::AddEmployee(Employee* emp)
{
	empList[empNum++] = emp;
}
void EmployeeHandler::ShowAllSalaryInfo() const
{
	/*for (int i=0;i<empNum;i++)
	sum+=empList[i]->ShowSalaryInfo();*/
    
    // empList: Employee객체의 포인터 배열
    //모든 객체를 Employee객체로 취급 
    //Employee 객체 안에 해당함수가 없고,
    //다른 포인터와 객체를 가리키면 접근이 제한된다 -> Employee 클래스 멤버로 범위가 제한
    
}
void EmployeeHandler::ShowTotalSalary() const
{
	int sum = 0;
	/*for (int i=0;i<empNum;i++)
	sum+=empList[i]->GetPay();*/
	cout << "Salary sum: " << sum << endl;
}
EmployeeHandler::~EmployeeHandler()
{
	for (int i = 0; i < empNum; i++)
	{
		delete empList[i]; empList[i] = NULL;
	}
}

//PermanentWorker.h
#ifndef PERMANENTWORKER_H
#define PERMANENTWORKER_H
#include "Employee.h"
class PermanentWorker
	:public Employee
{
private:
	int salary;
public:
	PermanentWorker(const char* name, int money);
	int Getpay() const;
	void ShowSalaryInfo() const;
};

#endif // !PERMANENTWORKER_H

#pragma once
//PermanentWorker.cpp
#include <iostream>
#include "Employee.h"
#include "PermanentWorker.h"
using namespace std;

PermanentWorker::PermanentWorker(const char* name, int money)
	:Employee(name), salary(money)
{

}
int PermanentWorker::Getpay() const
{
	return salary;
}
void PermanentWorker::ShowSalaryInfo() const
{
	ShowYourName();
	cout << "salary: " << Getpay() << endl << endl;
}

//TemporaryWorker.h
#ifndef TEMPORARYWORKER_H
#define TEMPORARYWORKER_H
#include "Employee.h"

class TemporaryWorker
	:public Employee
{
private:
	int workTime;
	int payPerHour;
public:
	TemporaryWorker(const char* name, int pay);
	void AddWorkTime(int time);
	int GetPay() const;
	void ShowSalaryInfo() const;
};

#endif // !TEMPORARYWORKER_H



#pragma once
//TemporaryWorker.cpp
#include <iostream>
#include "TemporaryWorker.h"
#include "Employee.h"
using namespace std;

TemporaryWorker::TemporaryWorker(const char* name, int pay)
	:Employee(name), workTime(0),payPerHour(pay)
{

}
void TemporaryWorker::AddWorkTime(int time)
{
	workTime += time;
}
int TemporaryWorker::GetPay() const
{
	return workTime * payPerHour;
}
void TemporaryWorker::ShowSalaryInfo() const
{
	ShowYourName();
	cout << "salary: " << GetPay() << endl << endl;
}

//SalesWorker.h
#ifndef SALESWORKER_H
#define SALESWORKER_H
#include "PermanentWorker.h"

class SalesWorker
	:public PermanentWorker
{
private:
	int salesResult;
	double bonusRatio;
public:
	SalesWorker(const char* name, int money, double ratio);
	void AddSalesResult(int value);
	int GetPay() const;				//PermanentWorker 클래스의 함수를 오버라이딩
	void ShowSalaryInfo() const;	//PermanentWorker 클래스의 함수를 오버라이딩
};
#endif // !SALESWORKER_H
#pragma once
//SalesWorker.cpp
#include <iostream>
#include "SalesWorker.h"
using namespace std;

SalesWorker::SalesWorker(const char* name, int money, double ratio)
	:PermanentWorker(name,money),salesResult(0),bonusRatio(ratio)
{

}
void SalesWorker::AddSalesResult(int value)
{
	salesResult += value;
}
int SalesWorker::GetPay() const
{
	return PermanentWorker::Getpay() + (int)(salesResult * bonusRatio);
	//PermanentWorker의 GetPay 함수 호출
}

void SalesWorker::ShowSalaryInfo() const
//PermanentWorker의 ShowSalaryInfo함수를 호출한다면, PermanentWorker의 GetPay함수를 호출한다.
//SalesWorker의 Getpay함수를 호출해야하기 때문에, 새롭게 정의한다.
{
	ShowYourName();
	cout << "salary: " << Getpay() << endl << endl;
	//SalesWorker의 GetPay 함수 호출
}

//main.cpp
#include <iostream>
#include <cstring>
#include "Employee.h"
#include "PermanentWorker.h"
#include "EmployeeHandler.h"
#include "SalesWorker.h"
#include "TemporaryWorker.h"
using namespace std;

int main(void)
{
//직원관리를 목적으로 설계된 컨트롤 클래스의 객체생성
EmployeeHandler handler;

//정규직 등록
handler.AddEmployee(new PermanentWorker("KIM", 1000));
handler.AddEmployee(new PermanentWorker("LEE", 1500));

//임시직 등록
TemporaryWorker* alba=new TemporaryWorker("Jung",700);
alba->AddWorkTime(5); //5시간 일한 결과 등록
handler.AddEmployee(alba);

//영엉집 등록
SalesWorker* seller = new SalesWorker("Hong", 1000, 0.1);
seller->AddSalesResult(7000); //영업실적 7000
handler.AddEmployee(seller);

//이번 달에 지불해야 할 급여의 정보
handler.ShowAllSalaryInfo();

//이번 달에 지불해야 할 급여의 총합
handler.ShowTotalSalary();

return 0;
}

아직, ShowAllSalaryInfo()함수와 ShowTotalSalary()함수가 완성되지 않았기 때문에 출력되는 정보가 없다.

반응형