I'm FanJae.

[C++ 기본 연습 문제] Chapter 05. 복사 생성자(Copy Constructor) 본문

C++/Basic Practice

[C++ 기본 연습 문제] Chapter 05. 복사 생성자(Copy Constructor)

FanJae 2024. 9. 5. 20:43

1. 복사 생성자의 정의

- 문제 04-3의 문제 2를 통해서 NameCard를 정의하였다. 그런데 이 클래스도 생성자 내에서 메모리 공간을 동적 할당하기 때문에 복사 생성자가 필요한 클래스이다. 이에 복사 생성자를 적절히 정의해보기 바라며, 복사 이후에 문제가 발생하지 않음을 다음 main 함수를 통해서 확인하기 바란다.

 

int main(void)
{
	NameCard manClerk("Lee", "ABCEng", "010-1111-2222", COMP_POS::CLERK);
	NameCard copy1 = manClerk;

	NameCard manSENIOR("Hong", "OrangeEng", "010-3333-4444", COMP_POS::SENIOR);
	NameCard copy2 = manSENIOR;

	copy1.ShowNameCardInfo();
	copy2.ShowNameCardInfo();
}

 

#include <iostream>
namespace COMP_POS
{
	enum { CLERK, SENIOR, ASSIST, MANAGER };
	void ShowPositionInfo(int pos)
	{
		switch (pos)
		{
		case CLERK:     std::cout << "사원" << std::endl; break;
		case SENIOR:	std::cout << "주임" << std::endl; break;
		case ASSIST:	std::cout << "대리" << std::endl; break;
		case MANAGER:	std::cout << "과장" << std::endl; break;
		}
	}
}

class NameCard
{
private:
	char* name;
	char* company;
	char* phone;
	int position;

public:
	NameCard(const char* _name, const char* _company, const char* _phone, int _position) : position(position)
	{
		name = new char[strlen(_name) + 1];
		company = new char[strlen(_company) + 1];
		phone = new char[strlen(_phone) + 1];
		strcpy(name, _name);
		strcpy(company, _company);
		strcpy(phone, _phone);
	}
	NameCard(const NameCard& copy) : position{ position }
	{
		name = new char[strlen(copy.name) + 1];
		company = new char[strlen(copy.company) + 1];
		phone = new char[strlen(copy.phone) + 1];
		strcpy(name, copy.name);
		strcpy(company, copy.company);
		strcpy(phone, copy.phone);
	}

	void ShowNameCardInfo() const
	{
		std::cout << "이름 : " << name << std::endl;
		std::cout << "회사 : " << company << std::endl;
		std::cout << "전화번호 : " << phone << std::endl;
		std::cout << "직급 : ";
		COMP_POS::ShowPositionInfo(position);
		std::cout << std::endl;
	}

	~NameCard()
	{
		delete [] name;
		delete [] company;
		delete [] phone;
	}
};

int main(void)
{
	NameCard manClerk("Lee", "ABCEng", "010-1111-2222", COMP_POS::CLERK);
	NameCard copy1 = manClerk;

	NameCard manSENIOR("Hong", "OrangeEng", "010-3333-4444", COMP_POS::SENIOR);
	NameCard copy2 = manSENIOR;

	copy1.ShowNameCardInfo();
	copy2.ShowNameCardInfo();

}

- 기존 작성했던 std::string에서는 이 문제가 발생하지 않으므로, 기존 코드에서 변경했다.

- char *일때는 manClerk이나 manSENIOR의 자원 회수가 일어나면 오류가 발생하게 된다.

Comments