MyString.h ( 헤더소스)
// CMyString 클래스 내부 인스턴스 및 메서드 선언부
class CMyString
{
public:
explicit CMyString(const char* paramstr);
CMyString(const CMyString &rhs);
~CMyString(void);
****operator char*(void) { return m_pszdata; }* // 문제점***
private: // 외부로부터 값 변경을 차단하기 위해 접근지시제어자를 Private 로 설정함
char* m_pszdata; // 사용자코드로부터 받은 문자열을 담은 동적메모리의 주소값을 저장할 인스턴스
int m_nlength; // 문자열 길이
public:
int SetString(const char* pszparam); // 문자열을 받아 동적메모리를 생성해 할당하는 메서드
const char* GetString() const; // 문자열 반환 상수화 메서드 (값쓰기를 하지않으므로 상수화한다)
void Release(); // 동적메모리 할당해제 메서드
CMyString& operator=(const CMyString &rhs); // 다중 연산자(=) 정의 메소드 ( 단순 대입연산자 정의 )
};
MyString.Cpp ( 메서드 정의 부 )
// CMyString 클래스 내부 인스턴스 및 메서드 선언부
class CMyString
{
public:
explicit CMyString(const char* paramstr);
CMyString(const CMyString &rhs);
~CMyString(void);
operator char*() const{ return m_pszdata; }
private: // 외부로부터 값 변경을 차단하기 위해 접근지시제어자를 Private 로 설정함
char* m_pszdata; // 사용자코드로부터 받은 문자열을 담은 동적메모리의 주소값을 저장할 인스턴스
int m_nlength; // 문자열 길이
public:
int SetString(const char* pszparam); // 문자열을 받아 동적메모리를 생성해 할당하는 메서드
const char* GetString() const; // 문자열 반환 상수화 메서드 (값쓰기를 하지않으므로 상수화한다)
void Release(); // 동적메모리 할당해제 메서드
CMyString& operator=(const CMyString &rhs); // 다중 연산자(=) 정의 메소드 ( 단순 대입연산자 정의 )
};
메인코드
// CmyString 객체를 사용하는 사용자의 코드부
#include "stdafx.h"
#include "MyString.h"
void TestFunc(const CMyString ¶m) // 인수 strData 를 참조하는 CMyString 형 객체 param
{
cout << param << endl; // <<<--- 문제 발생 지점***
}
int _tmain(int argc, _TCHAR* argv[]) // 과제4 : 변환생성자 및 형변환 연산자 사용자 코드
{
CMyString strdata("Hello");
::TestFunc(strdata);
::TestFunc(CMyString("World"));
return 0;
}
문제 발생지점은 코드에 주석으로 표시했습니다.
사용자 코드
*cout << param << endl;
에서 사진과 같은 오류가 발생합니다.
해설지 를 보고 Mystring.h 헤더 파일에서
operator char*() { return m_pszdata; }
부분을
operator char*() const { return m_pszdata; }
같이 메서드를 상수화 시키면 오류가 사라집니다.
제가 알기론 메서드 이름 뒤에 const 를 붙인다는건 상수화된 메서드로 선언한다는 것이고, "상수화된 메서드는 일반적인 방법으론 맴버변수와 함수에 쓰기접근을 할 수 없다." 라고 알고있습니다.
하지만 이렇게 "형변환자 함수를 상수화 한다" 해서 왜 이 오류가 근본적으로 해결되는지 이해하기 어렵습니다.
(그냥 멤버 함수 m_pszdata
를 읽어오고 m_pszdata
를 반환할 기능을 할뿐인데 말이죠.)
도움 좀 부탁드리겠습니다.