PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2008/11/01 22:47:25
Name 루시리스
File #1 err.jpg (90.9 KB), Download : 4
Subject C++ 연산자 오버로딩 관련 질문입니다.


#include <iostream>
#include <cstring>

using namespace std;

class CString{
private :
        int len;
        char *str;

public :
        CString(char *s="Unknown"){
                len=strlen(s);
                str=new char[len+1];
                strcpy(str, s);
        }
        CString &operator=(const CString &Po){                //대입 연산자 오버로딩
                delete [] str;
                len=Po.len;
                str=new char[len+1];
                strcpy(str, Po.str);
                return (*this);
        }

        CString(const CString &Po, const CString &Pq){                //복사 생성자
                len=Po.len+Pq.len;
                str=new char[len+1];
                strcpy(str, Po.str);
                str=strcat(str, Pq.str);
        }
        ~CString(){delete [] str;}

        friend CString operator+(const CString &Po);
        friend ostream &operator<<(ostream &out, const CString Po);
};

CString operator+(const CString &Po, const CString &Pq)                //전역함수 + 오버로딩
{
        return CString(Po, Pq);
}

ostream &operator<<(ostream &out, const CString Po)                //전역함수 << 오버로딩
{
        out<<Po.str;
        return out;
}

int main()
{
        CString str1="Good ";
        CString str2="morning";
        CString str3;

        str3=str1+str2;

        cout<<str1<<endl;
        cout<<str2<<endl;
        cout<<str3<<endl;

        return 0;
}

실행 결과는 제대로 뜨는데 컴파일하면 경고가 5개나 뜨고.. 무슨 strcpy 관련.. 그리고 실행하면

위와같은 에러가 뜨네요.. 어디가 문제인가요?

버젼은 비주얼 스튜디오 2005 입니다.

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
MoreThanAir
08/11/01 23:01
수정 아이콘
CString이 이미 MFC 내에 있는 클래스 이름이라서 그런거 아닐까요...

다른 이름으로 클래스를 한 번 만들어 보심이...
루시리스
08/11/01 23:06
수정 아이콘
MoreThanAir님// 이름 다르게 바꿔봤는데도 그대로네요..
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
수정 아이콘
루시리스님// 답변이 늦었네요 ;;
지금 복사생성자라고 생각해서 구현하신 저 부분을 +연산자에 넣으시면 됩니다.
혹은, 지금 두개를 더해 새로운 객체를 만드는 함수는 그대로 두고 위에 말한 복사생성자만 더 만들어도 무방합니다.
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
44413 재학생입영신청에 관해서 질문드립니다. [1] 일묘2089 08/11/02 2089
44412 컴퓨터 구매를 하려고 하는데... [2] 돌부처님1616 08/11/02 1616
44411 동성애에 관한 의문 [11] 브랜드뉴2536 08/11/02 2536
44410 신검 날짜에 대해서 답변 좀 부탁드립니다 [6] Muse2437 08/11/02 2437
44409 일본인의 화법에 관해서 잘아시는분 계신가요,,,? [3] buddha2503 08/11/02 2503
44408 모니터를 바꿨더니 영상이 [13] 릴리러쉬1881 08/11/02 1881
44407 군입대 날짜에 대해서 질문좀요 ㅠ(댓글로 질문 하나 추가요) [7] snut2097 08/11/02 2097
44406 중고컴퓨터 이정도가격 어떤가요? ㅠㅠ [7] ojh8810042097 08/11/02 2097
44404 미국 내 인종차별에 대해서.. [7] 이재열2421 08/11/02 2421
44403 유게에 있는 라모스 감독 짤방 관련해서 질문 드립니다. [7] skyk1845 08/11/02 1845
44402 이번 스타리그 결승전 끝나고 나오는 노래가 뭔가요? [1] 지휘자1922 08/11/02 1922
44401 컴퓨터 조립하기 쉽나요? [10] eros[zerg]2269 08/11/01 2269
44400 헌터헌터 26권은 언제쯤 나올까요? [12] BIONICcontrol.12486 08/11/01 2486
44399 스타 누구랑 하시나요? [8] 문근영2141 08/11/01 2141
44398 지금의 세계 경제위기를 '화폐시장'측면에서... 어떻게 볼 수 있을까요? [2] 파잇힝1570 08/11/01 1570
44397 헤드폰 추천 부탁드립니다^^ [6] HL선샤인1865 08/11/01 1865
44396 C++ 연산자 오버로딩 관련 질문입니다. [5] 루시리스2177 08/11/01 2177
44395 통계학에 대해서 질문입니다. [4] worcs1557 08/11/01 1557
44394 공무원 시험에 대해서 조언 부탁드립니다. [8] TOR[RES]1939 08/11/01 1939
44393 축구에서 수비수는 어떨때 공격에 가담하나요?? [13] 잘가라장동건2480 08/11/01 2480
44392 영어문장 하나 해석좀 해주세요~ [7] 졸린쿠키1542 08/11/01 1542
44391 저가브랜드 스킨화장품좀 추천해주세요. [10] MayBee2146 08/11/01 2146
44390 c++ 좀 아시는분 봐주세요.. [6] 녹차한잔1822 08/11/01 1822
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로