Minwoo Dev.

[C++] 윤성우의 열혈 C++ 프로그래밍 Ch05-1 : 복사 생성자의 정의 문제풀이 본문

C++

[C++] 윤성우의 열혈 C++ 프로그래밍 Ch05-1 : 복사 생성자의 정의 문제풀이

itisminu 2024. 3. 16. 15:31
728x90
반응형
SMALL

문제 

 

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

 

[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();
    return 0;
}

 

 

 

정답

#include <iostream>
#include <cstring>
using namespace std;

namespace COMP_POS
{
    enum
    {
        CLERK,
        SENIOR,
        ASSIST,
        MANAGER
    };

    void ShowPositionInfo(int pos)
    {
        switch (pos)
        {
        case CLERK:
            cout << "사원" << endl;
            break;
        case SENIOR:
            cout << "주임" << endl;
            break;
        case ASSIST:
            cout << "대리" << endl;
            break;
        case MANAGER:
            cout << "과장" << endl;
            break;
        }
    }
}

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

public:
    NameCard(char *_name, char *_company, char *_phone, int pos) : position(pos)
    {
        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(NameCard &namecard) : position(namecard.position)
    {
        name = new char[strlen(namecard.name) + 1];
        company = new char[strlen(namecard.company) + 1];
        phone = new char[strlen(namecard.phone) + 1];
        strcpy(name, namecard.name);
        strcpy(company, namecard.company);
        strcpy(phone, namecard.phone);
    }

    void ShowNameCardInfo()
    {
        cout << "이름 : " << name << endl;
        cout << "회사 : " << company << endl;
        cout << "전화번호 : " << phone << endl;
        cout << "직급 : ";
        COMP_POS::ShowPositionInfo(position);
        cout << 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();
    return 0;
}

 

 

결과

728x90
반응형
LIST