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 &param) // 인수 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함수를 정의할 경우에는 멤버 변수의 값이 변경되지 않는다는것을 보장하기 때문에 멤버함수로 인정하는것이구요.

    멤버함수 구현부를 올려주지 않으셔서 정확한 교정은 힘들지만 대략적으로 간단한 해결방법 두가지를 알려드리자면

    • 첫번째로 질문자님이 올려주셨던것처럼 operatorconst함수로 변경해주시면 됩니다.
    • 두번째로는 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(); // 문제없음
    }
    

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

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

(ಠ_ಠ)
(ಠ‿ಠ)