2013-11-26 3 views
-5

C++의 friend 함수 및 연산자 오버로딩을 사용하여 HiThere 두 개의 문자열을 추가하는 다음 코드가 있습니다.C++에서 프렌드 함수 및 연산자 오버플로

#include<iostream.h> 
#include<conio.h> 
class STRING 
{ 
char *str; 
public: 
    STRING(char *p) { str=p; } 
    STRING(STRING& s) { str=s.str; } 
    friend STRING operator+(STRING &s1,STRING& s2); 
    friend ostream& operator<<(ostream& dout,STRING& s) 
    { 
     dout<<s.str; 
     return dout; 
    } 
}; 
STRING operator+(STRING &s1,STRING& s2) 
{ 
STRING x(s1); int i,j=0; 
for(i=0;x.str[i]!='\0';i++); 
x.str[i]=' '; 
while((x.str[++i]=s2.str[j++])!='\0'); 
x.str[i]='\0'; 
return x; 
} 
void main() 
{ 
clrscr(); 
cout<<"\n\n\t\t"; 
STRING s1="Hi";  cout<<" String s1: "<<s1<<"\n\n\t\t"; 
STRING s2="There"; cout<<" String s2: "<<s2<<"\n\n\t\t"; 
STRING s3=s1+s2;  cout<<" S1+S2 is : "<<s3<<"\n\n\t\t"; 
getch(); 
} 

나는 그것의에 오류가 표시되지하지만이 프로그램을 실행하고 때, 나는 그들을 수정 후 당신은 문자열 리터럴을 전달하는 팝업 상자

Unhandled exception at 0x011f1506 in Program 6.exe: 0xC0000005: Access violation writing location 0x011f7860. 
+0

포인터의 0 포함 또는 소유권 외에도 읽기 전용 데이터 (문자열 리터럴)를 코드에 쓰는 중입니다. – WhozCraig

+0

의심 할 여지없이 얻을 수있는 컴파일러 경고에주의를 기울여야합니다. 당신의'operator +'는 여러 가지 이유로 정의되지 않은 행동을 일으킨다. – Praetorian

+0

컴파일러에서 -Wall 또는 이와 동등한 옵션을 사용하여 컴파일하지 않으면 구문 오류가 없으므로 operator + 함수에 잘못된 내용이보고되지 않을 수 있습니다. 그것에 대한 모든 경고가 있더라도 컴파일러는 포인터가 함수에 전달 되었기 때문에 포인터가 읽기 전용임을 인식하지 못할 수 있습니다. – IllusiveBrian

답변

3

에 다음과 같은 오류를 받고 있어요 솔루션을 구축하고 -이 허용되지 않습니다, 당신은 수정 "안녕"또는 수 없습니다 "가"새로운 더 큰 문자열

x.str[i]=' '; 

또한 결코 할당되지 않은 공간

+0

TURBO C에서 동일한 프로그램을 실행했는데 VS C++ 2010에서는 실행되지 않았지만 (위 프로그램이 터보 C로 업데이트 됨) –

+0

@AkashSharma TURBO C가 자동으로 코드의 결함을 극복 할 수있는 마법을 구현했습니다 ... –

+0

그래서이 프로그램에 대한 패치가있어서 VS C++에서도 실행됩니다 –