생성자와 소멸자 연습문제 입니다, 풀었는데 다른 방법도 궁금해서 질문합니다
조회수 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 답변
-
이렇게 풀어서 복사생성자를 사용할땐 이름 뒤에 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::string
을const char*
로 바꾼들 말씀하신 문제는 똑같이 발생할 가능성이 큽니다.
댓글 입력