2013-11-26 3 views
-5

У меня есть следующий код для добавления двух строк Hi и There с использованием функции друга и перегрузки оператора на 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++ –

Смежные вопросы