:: 게시판
:: 이전 게시판
|
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
통합규정 1.3 이용안내 인용"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
08/11/01 23:01
CString이 이미 MFC 내에 있는 클래스 이름이라서 그런거 아닐까요...
다른 이름으로 클래스를 한 번 만들어 보심이...
08/11/02 00:13
루시리스님//
우선, 복사생성자가 잘못되어서 그렇습니다. 복사생성자란 같은 클래스타입의 이미 만들어진 변수로 새로운 카피를 생성하는 것이지 위처럼 두개를 받아 더해 새로운 객체를 만드는 것이 아닙니다. CString(const CString& in) len = in.len; str = new char[len+1]; strcpy(str,in.str); 이렇게 복사생성자를 만드시면 정상동작합니다. 이전에 정상동작하지 않은 이유는, 위 예제에 friend ostream &operator<<(ostream &out, const CString Po); 함수가 틀린 것이 더큰 이유입니다. 두번째 파라미터인 cosnt CString Po는 call by value형태로서 복사생성자를 호출하여 새로운 변수를 만들어 냅니다. 그런데 이전에 복사생성자를 만들지 않았으니, 컴파일러가 기본적으로 제공하는 '얕은복사'를 실행하게 되고, 함수가 끝날때 생성된 지역변수를 삭제해버립니다. 복사생성자를 공부하셨으면 동적할당이 있을때 얕은 카피를 하면 어떤일이 있을지는 아시겠죠? 제대로 하려면 위처럼 복사생성자를 만들어 주시고, friend ostream &operator<<(ostream &out, const CString &Po); 이렇게 고쳐주세요. (참고로 레퍼런스타입으로 함수를 고치면 복사생성자가 호출되지 않기 때문에 얕은 카피로도 별 문제가 없지만, 추천하지는 않습니다. )
08/11/02 00:41
tsana님// 그렇다면 + 연산자 오버로딩은 어떻게 나타내야하나요? 두 문자열을 더하도록 작성해야하는데
아무리 해봐도 안되서 복사생성자로 그냥 두개를 더했거든요..
08/11/02 11:13
루시리스님// 답변이 늦었네요 ;;
지금 복사생성자라고 생각해서 구현하신 저 부분을 +연산자에 넣으시면 됩니다. 혹은, 지금 두개를 더해 새로운 객체를 만드는 함수는 그대로 두고 위에 말한 복사생성자만 더 만들어도 무방합니다.
|