생성자와 소멸자 연습문제 입니다, 풀었는데 다른 방법도 궁금해서 질문합니다

조회수 717회
#include <iostream>
#include <string>
using namespace std;

class CPerson
{
public:
    CPerson(string _name, int _id)
    {
        m_Name = _name;
        m_ID = _id;
    }
    CPerson(const CPerson& _person)
    {
        m_Name = _person.m_Name + " Copy";
        m_ID = -1;
    }

    ~CPerson()
    {

    }

    string m_Name;
    int m_ID;
};

void main()
{
    CPerson p1("Bill", 1);
    CPerson p2 = p1;

    cout << p1.m_Name << " " << p1.m_ID << endl;
    cout << p2.m_Name << " " << p2.m_ID << endl;
}

이렇게 풀어서 복사생성자를 사용할땐 이름 뒤에 Copy를 붙이고, ID는 -1이 되도록 했는데요. 혹시 string 말고 const char*를 사용해서 같은 결과가 나오도록 할 수 있을까요?

string을 사용해서 문자열 합친 다음에 .c_str()로 const char* 만들어서 값을 넘겼는데, 계속 오류가 나서... 그냥 string으로 처리하긴 했는데 const char*로 하는 방법도 궁금해서 여쭤봅니다.

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    이렇게 풀어서 복사생성자를 사용할땐 이름 뒤에 Copy를 붙이고, ID는 -1이 되도록 했는데요. 혹시 string 말고 const char*를 사용해서 같은 결과가 나오도록 할 수 있을까요?

    멤버 변수 m_Name의 타입을 const char*로 하고 싶단 말씀이시죠? 그런 경우 문자열에 대한 메모리 관리를 다음과 같이 직접 해주어야 합니다.

    class CPerson
    {
    public:
        CPerson(string _name, int _id)
            : m_Name()
        {
            m_Name = new char[_name.size() + 1]{};
            std::strncpy(m_Name, _name.c_str(), _name.size());
            m_ID = _id;
        }
    
        CPerson(const CPerson& _person)
            : m_Name()
        {
            char const tag[] = " Copy";
            auto size = std::strlen(_person) + sizeof(tag) / sizeof(tag[0]);
            m_Name = new char[size]{};
            std::strncpy(m_Name, _name.c_str(), _name.size());
            std::strcat(m_Name, tag);
            m_ID = -1;
        }
    
        ~CPerson()
        {
            delete[] m_Name;
        }
    
        const char* m_Name;
        int m_ID;
    };
    

    하지만 프로그래머의 실수를 유발하기에 그렇게 권장되지는 않습니다. C++에는 std::string이란 멋진 클래스가 있는 걸요.

    string을 사용해서 문자열 합친 다음에 .c_str()로 const char* 만들어서 값을 넘겼는데, 계속 오류가 나서...

    대게 이런 경우 객체가 소멸되어 c_str()으로 가져온 메모리 주소가 유효하지 않은 경우일 가능성이 높습니다.

    c_str()가 반환하는 메모리 주소는 해당 std::string 객체와 생명 주기가 같기 때문에 해당 객체가 소멸되지 않고 유지되도록 신경을 써 주어야합니다.

    즉, std::stringconst char* 로 바꾼들 말씀하신 문제는 똑같이 발생할 가능성이 큽니다.

    • 신경써야할게 많군요, 친절한 답변 감사합니다 ㅎ KyeongWon Jang 2021.12.25 22:53

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)