편집 기록

편집 기록
  • 프로필 nowp님의 편집
    날짜2020.03.06

    C++ 클래스 내부 형변환 질문, const 지시자


    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를 반환할 기능을 할뿐인데 말이죠.)

    도움 좀 부탁드리겠습니다.

  • 프로필 알 수 없는 사용자님의 편집
    날짜2020.03.05

    C++ 클래스 내부 형변환 질문


    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를 반환할 기능을 할뿐인데 말이죠...)

    도움좀 부탁드리겠습니다.