Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- dynamic_cast
- c++ basic practice
- virtual function table
- virtual function
- vector size
- c++ multi chatting room
- std::vector
- diamond inheritance
- increment operator
- pointer to member data
- operator overloading
- member function pointer
- discord bot
- std::cout
- base from member
- C++
- 더 지니어스 양면포커
- std::endl
- std::ostream
- delete function
- suffix return type
- placement new
- vector capacity
- new&delete
- conversion constructor
- constructor
- this call
- return by reference
- virtual inheritance
- virtual destructor
Archives
- Today
- Total
I'm FanJae.
[C++ 기본 연습 문제] Chapter 05. 복사 생성자(Copy Constructor) 본문
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의 자원 회수가 일어나면 오류가 발생하게 된다.
'C++ > Basic Practice' 카테고리의 다른 글
[C++ 기본 연습 문제] Chapter 08. 상속과 다형성 (0) | 2024.09.07 |
---|---|
[C++ 기본 연습 문제] Chapter 07. 상속(Inheritance)의 이해 (1) | 2024.09.06 |
[C++ 기본 연습 문제] Chapter 04. 클래스의 완성 (0) | 2024.09.04 |
[C++ 기본 연습 문제] Chapter 03. 클래스의 기본 (1) | 2024.09.03 |
[C++ 기본 연습 문제] Chapter 02. 연습문제 정답 (0) | 2024.09.01 |
Comments