2013-11-26 58 views
-5

我有以下代碼添加兩個字符串HiThere使用C++中的朋友函數和運算符重載。在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

除了指針的零遏制或所有權之外,您還將只讀數據(字符串文字)發送到向其寫入*的代碼中。 – WhozCraig

+0

也許你應該首先關注你毫無疑問得到的編譯器警告。您的'operator +'會導致未定義的行爲,原因有幾個。 – Praetorian

+0

如果他在編譯器中沒有用-Wall或某個等價選項進行編譯,則可能不會在operator +函數中報告任何錯誤,因爲沒有語法錯誤。即使所有的警告都可能是由於編譯器傳遞給函數,編譯器不能識別指針是隻讀的。 – IllusiveBrian

回答

3

你傳入字符串文字,然後加以改進 - 這是不允許的,你不能修改「你好」或「有」

新大串
x.str[i]=' '; 

你也永遠不會分配空間

+0

我在TURBO C中嘗試過相同的程序,其運行良好,但沒有在VS C++ 2010中程序更新了Turbo C) –

+0

@AkashSharma可能是TURBO C已經實現了一些魔法來自動克服你的代碼的缺陷... –

+0

所以有沒有這個程序的任何補丁,以便它也可以運行在VS C++ –