Я пытаюсь перегрузить знак плюс, чтобы объединить две строки, но получаю сообщение об ошибке.
VS 2010 дает утверждение не удалось сообщение: «Выражение: (L» Буфер слишком мал » && 0) «; Файл: f: \ dd \ vctools \ crt_bld \ self_x86 \ crt \ src \ tcscat_s.inl; Линия: 42
Что вы думаете не так с моим кодом?
#include "stdafx.h"
class MyString{
int l; // the length of the array pointed by buf
char *buf; //pointer to a char array
public:
...
MyString(char *);
friend MyString operator+(MyString &,MyString &);
...
};
MyString::MyString(char *p)
{
buf=new char[strlen(p)+1];
strcpy_s(buf,strlen(p)+1,p);
l=strlen(p)+1;
}
MyString operator+(const MyString &a,const MyString &b)
{
MyString result("");
result.l=a.l+b.l;
delete[] result.buf;
result.buf=new char[result.l+1];
result.buf[0]='\0';
strcat_s(result.buf,result.l+1,a.buf);
strcat_s(result.buf,result.l+1,b.buf);
return result;
}
int _tmain(int argc, _TCHAR* argv[])
{
MyString a("hello"),b("world"),c("");
c=a+b;
system("pause");
return 0;
}
Это работает сейчас! Всем спасибо!
В операторе + переменная «MyString result» была объявлена в стеке и впоследствии возвращена по ссылке, что было неверно.
Затем ОП был отредактирован. Переменная «результат» больше не объявлялась в стеке, а вместо этого размещалась в куче. Однако затем произошла утечка памяти.
Здесь нужно вернуться по значению, а также объявить «MyString result» в стеке. Также убедитесь, что у вас есть конструктор копирования. И деструктор в этом отношении.
Вы также должны сделать так, чтобы ваш конструктор принимал const char *.
strcat_s(result->buf,strlen(a.buf),a.buf); strcat_s(result->buf,strlen(b.buf),b.buf);
Второй параметр strcat_s
это размер буфера назначения, а не размер строки, которая должна быть добавлена.
Так что вам нужно изменить это на
strcat_s(result->buf,result->l+1,a.buf);
strcat_s(result->buf,result->l+1,b.buf);
Остальная часть оператора + реализация также нарушена, как уже отмечалось другими. Создание экземпляра и его возврат по значению — это нонсенс. Просто создайте экземпляр результата в стеке и верните его по значению.
Так должно быть result.buf=new char[result.l+1];
чтобы разрешить для нулевого символа.