C++ 클래스 내부 형변환 질문, const 지시자
조회수 1018회
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
를 반환할 기능을 할뿐인데 말이죠.)
도움 좀 부탁드리겠습니다.
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
1 답변
-
const
키워드가 붙은 자료형의 변수에 담겨있는 값는 아시다시피 수정이 불가합니다.올려주신 코드
main.cpp
를 보시면 아래와같은 부분이 있는데요,void TestFunc(const CMyString& param) { std::cout << param << std::endl; }
보시면 함수 인자로
const CMyString&
형을 받고있습니다.컴파일러 입장에서
CMyString
내부의operator char* ()
함수에서는 멤버변수의 값이 변경될 여지가 있기 때문에const CMyString
형으로 변수를 선언 할 경우에 아예 없는 함수로 간주합니다.operator char* () const
함수를 정의할 경우에는 멤버 변수의 값이 변경되지 않는다는것을 보장하기 때문에 멤버함수로 인정하는것이구요.멤버함수 구현부를 올려주지 않으셔서 정확한 교정은 힘들지만 대략적으로 간단한 해결방법 두가지를 알려드리자면
- 첫번째로 질문자님이 올려주셨던것처럼
operator
를const
함수로 변경해주시면 됩니다. - 두번째로는
TestFunc
함수의 인자를const CMyString&
형에서CMyString&
형등으로 수정처리한 후 적절히 전체 코드를 교정합니다.
설명드린 내용을 이해하시는데 도움이 되기를 바라며 간단한 예제코드를 작성해보았습니다.
#include <iostream> class A { private: char* char_pointer_; public: A(const char* arg) { this->char_pointer_ = (char*)arg; } char* GetMyCharPointer() { return this->char_pointer_; } char* GetMyCharPointerConst() const { return this->char_pointer_; } }; int main() { A standardA("1000"); const A constA("1000"); standardA.GetMyCharPointer(); // 문제없음 standardA.GetMyCharPointerConst(); // 문제없음 constA.GetMyCharPointer(); // 에러: constA안에 GetMyCharPointer라는 멤버 함수자체가 존재하지 않음 constA.GetMyCharPointerConst(); // 문제없음 }
- 첫번째로 질문자님이 올려주셨던것처럼
댓글 입력