요구사항에 맞게 코드 구현하기
더보기
SetString() 메서드 정의할 때주의사항
- 매개변수로 전달된 문자열의 길이를 측정하고 m_nLength에 저장합니다.
- 매개변수로 전달된 문자열이 저장될 수 있는 메모리를 동적 할당합니다. (new 연산자를 이용할 것)
- 동적 할당한 메모리에 문자열을 저장(m_pszData)합니다.
- 매개변수가 NULL이거나 문자열의 길이가 0인 경우를 고려해야합니다.
- 여기서 동적할 당한 메모리는 언제 어디서 해제하는지 생각하고 대응합니다.
- 사용자가 다음예와 같이 이 함수를 2회 호출하는 경우를 생각하고 대응합니다.
(a.SetString("Hello"); a.SetString("World");)
Release() 메서드 정의할 때 주의사항
- m_pszData라는 멤버 변수가 가리키는 메모리를 해제합니다. (delete 연산자를 이용할 것)
- 사용자 코드에서 접근이 허용된 메서드들은 무엇이든 호출할 수 있으며 그 순서는 임의로 달라질 수 있다. 가령 Release()메서드를 호출한 직후 SetString() 함수를 호출할 수 있는 것이죠. 이 같은 상황을 고려하면서 코드를 작성합니다.
/*MyString.h*/
class CMyString
{
public:
CMyString();
~CMyString();
private:
//문자열을 저장하기 위해 동적 할당한 메모리를 가리키는 포인터
char* m_pszData;
//저장된 문자열의 길이
int m_nLength;
public:
int SetString(const char* pszParam);
const char* GetString();
void Release();
};
/*MyString.cpp*/
#include "stdafx.h"
#include "MyString.h"
CMyString::CMyString()
: m_pszData(NULL)
, m_nLength(0)
{
}
CMyString::~CMyString()
{
//객체가 소멸하기 전에 메모리를 해제한다.
Release();
}
int CMyString::SetString(const char*pszParam)
{
//새로운 문자열 할당에 앞서 기존 정보를 해제한다.
Release();
//NULL을 인수로 함수를 호출했다는 것은 메모리를 해제하고
//NULL로 초기화하는 것으로 볼 수 있다.
if(pszParam==NULL)
return 0;
//길이가 0인 문자열도 초기화로 인식하고 처리한다.
int nLength = strlen(pszParam);
if(nLength==0)
return 0;
//문자열의 끝인 NULL문자를 고려해 메모리를 할당한다.
m_pszData = new char[nLength + 1];
//새로 할당한 메모리에 문자열을 저장한다.
strcpy_s(m_pszData, sizeof(char)*(nLength+1), pszParam);
m_nLength = nLength;
//문자열의 길이를 반환한다.
return nLength;
}
void char* CMyString:GetString()
{
return m_pszData;
}
void CMyString::Release(){
//이 함수가 여러번 호출될 경우를 고려해 주요 멤버를 초기화한다.
if(m_pszData !=NULL)
delete[] m_pszData
m_pszData = NULL;
m_nLength = 0;
}
- strlen(char*) : char배열 문자열길이를 구한다. (null빼고)
- strcpy_s(char * (저장할변수), sizeof(char)*len, char* (복사대상)) :문자열 복사
'◼️C++' 카테고리의 다른 글
[C++] delete 예약어를 이용한 명시적 메서드 삭제 (0) | 2023.09.17 |
---|---|
[C++] 상수형 메서드, mutable, const_cast< > (0) | 2023.09.17 |
[C++] 메서드, this 포인터 (0) | 2023.09.17 |
[C++] 명시적 디폴트 생성자 (0) | 2023.09.17 |
[C++] 생성자 다중정의 (0) | 2023.09.17 |