У меня есть следующий код для добавления двух строк 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.
Помимо нулевого ограничения или права собственности на указатели, вы отправляете данные только для чтения (строковые литералы) в код, который * пишет * к нему. – WhozCraig
Возможно, вам стоит начать с рассмотрения предупреждений компилятора, которые вы, несомненно, получаете. Ваш 'operator +' вызывает неопределенное поведение по нескольким причинам. – Praetorian
Если он не компилирует с -Wall или какой-либо эквивалентной опцией в своем компиляторе, он не может сообщить ничего плохого в функции operator +, потому что нет синтаксических ошибок. Даже со всеми предупреждениями в нем может быть, что компилятор не распознает, что указатель доступен только для чтения, поскольку он был передан в функцию. – IllusiveBrian