반응형
실습하면서 알게된 점
1. 원본 데이터를 수정하고싶으면 &로 리턴해주면 된다
2. this는 클래스의 포인터 타입이다.
3. 포인터 타입은 -> 를 사용해야한다.
얕은 복사
Simple sum2(sim1)
- 복사생성자를 생성하지 않아도 저절로 생성된
- 내용만 복사됨
문제점
- 동적할당 된 내용을 복사한다면, 주소값도 값이 복사되기 때문에
소멸될 때 런타임 오류가 일어남.
-> 깊은 복사로 해결 가능
//lec9_Salesman.h
#pragma once
#include<string>
using namespace std;
class Salesman
{
private:
string name;
double sales;
public:
Salesman();
~Salesman();
Salesman(string name, double sales);
void setName(string name);
void readInput();
string getSalesmaninfo();
double getSales() {
return sales;
}
};
// lec9_Salesman.cpp
#include "lec9_Salesman.h"
#include<iostream>
Salesman::Salesman()
:name("noname"), sales(0.0)
{
}
Salesman::~Salesman()
{
}
Salesman::Salesman(string name, double sales)
:name(name), sales(sales)
{
}
void Salesman::setName(string name)
{
this->name = name;
this->sales = sales;
}
void Salesman::readInput()
{
cout << "이름과 판매액을 입력 하세요 : ";
cin >> name >> sales;
}
string Salesman::getSalesmaninfo()
{
return "이름 : " + this->name + ",판매액 : " + to_string(this->sales); // string으로 변환
}
//lec9_SalesReport.h
#pragma once
#include "lec9_salesman.h"
class SalesReport
{
private:
Salesman* team;
double highestSales;
double averageSales;
int highestSalesindex;
int number;
public:
SalesReport();
~SalesReport();
SalesReport(int number);
void computeStats();
Salesman& getBestClerk();
string getTeaminfo();
SalesReport& getTeam();
};
//lec9_SalesReport.cpp
#include "lec9_SalesReport.h"
SalesReport::SalesReport()
:number(0), team(NULL)
{
}
SalesReport::~SalesReport()
{
if (team != NULL)
delete[] team;
}
SalesReport::SalesReport(int number)
:number(number)
{
team = new Salesman[number];
for (int i = 0; i < number; i++) {
team[i].readInput();
}
}
void SalesReport::computeStats()
{
this->highestSalesindex = 0;
this->highestSales = team[0].getSales();
this->averageSales = team[0].getSales();
for (int i = 1; i < number; i++) {
averageSales += team[i].getSales();
if (this->highestSales < team[i].getSales()) {
this->highestSales = team[i].getSales();
this->highestSalesindex = i;
}
}
this->averageSales = this->averageSales / this->number;
}
Salesman& SalesReport::getBestClerk()
//원래 데이터의 별명을 전달하기 때문에 객체 원본데이터를 변경 할 수 있음
{
return team[this->highestSalesindex];
}
string SalesReport::getTeaminfo()
{
return to_string(this->number);
}
SalesReport& SalesReport::getTeam()
{
return *this; //this는 클래스의 포인터타입
}
// 메인
#include "lec9_SalesReport.h"
#include<iostream>
using namespace std;
int main() {
//얕은복사에서 동적할당 소멸할 때 문제가 생김, 동적할당 주소까지 복사 되어서
SalesReport team1(3);
SalesReport team2(team1);
cout << team1.getTeaminfo() << endl;
cout << team2.getTeaminfo() << endl;
return 0;
}
반응형
'학부내용 예습 > [ 2021 겨울 ] C++' 카테고리의 다른 글
[ 11강 ] 연결리스트 (Linked List) (0) | 2022.02.20 |
---|---|
[ C++ ] 10강. 깊은 복사, mutable, friend, static 멤버변수/함수 (0) | 2022.02.05 |
[ 8강 ] 클래스 (const 멤버함수, 생성자, 소멸자) (0) | 2022.02.05 |
[ C++ ] 7강. 클래스, 객체지향 프로그래밍 (0) | 2022.01.30 |
[ C++ ] 6강. 동적할당 (0) | 2022.01.28 |