학부내용 예습/[ 2021 겨울 ] C++

[ C++ ] 9강. 실습, 얕은 복사

haena02 2022. 2. 5. 03:29
반응형

실습하면서 알게된 점

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;
}
반응형