Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2013, 00:36   #1
милица
 
Аватар для милица
 
Регистрация: 01.03.2013
Сообщений: 3
По умолчанию Перегрузка оператора += для строк С++

Доброго времени суток!
Возникла такая проблема. Есть класс строк, для него нужно переопределить оператор +=. Компилируется, но в main перед выходом из функции (проверено точкой остановки) вылетает с кодом

HEAP CORRUPTION DETECTED After normal block (#137) at .......
crt detected that the application wrote to memory after end of heap buffer

В чём проблема? Совсем не хочется делать сложно с циклами и лишним копированием...
Имеющий отношение к делу код:
Visual Studio 2010

String.h
Код:
class String
{
	char *str;
	int n;	
public:
	String () {n=-1; str=0;};
	explicit String (int);
	String (const char*);
	String (const String&);
	~String() {delete[] str;};

	String& operator=  (const String&);
	String& operator+= (const String&);
};
String.cpp
Код:
#include "String.h"
using namespace std;

String::String(int nstr)            {n = (nstr < 0) ? 0 : nstr; str=new char[n+1]; str[n]=0;}
String::String(const char* s)	  {n = strlen(s); str = new char[n+1];	strcpy(str, s);};
String::String(const String& s) {n = s.n; str = new char[n+1]; strcpy(str, s.str); };

String& String::operator+= (const String& s)  {
	n += s.n;
	strcat(str, s.str);	
	return *this;
};
main.cpp
Код:
int main()
{

	const char str1[]="xyz";
	String s1(5);
        String s2("opq");	
	String s4(str1);	

	s1 = s2;
	s2 += s4;

        cout << "press any key" << endl;	
	getch();
	return 0;
}

Последний раз редактировалось милица; 03.03.2013 в 00:39.
милица вне форума Ответить с цитированием
Старый 03.03.2013, 01:13   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Сам только взялся за C++.
Если судить по справке:
Цитата:
Помните, что при выполнении операций с массивами символов контроль нарушения их границ не выполняется, поэтому программист должен сам позаботиться о достаточном размере массива str1, позволяющем вместить как его исходное содержимое, так и содержимое массива str2.
Вы не подготавливаете место для хранения всей строки.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 03.03.2013, 02:27   #3
милица
 
Аватар для милица
 
Регистрация: 01.03.2013
Сообщений: 3
По умолчанию

Да, Вы правы. Переписала так:
String.cpp
Код:
String& String::operator+= (const String& s)  {
	char* var = new char[n+1];
	strcpy(var, str);
	delete str;
	n += s.n;
	str = new char[n+1];
	strcpy(str, var);
	strcat(str, s.str);
	delete[] var;
	return *this;
};
Но теперь вылетает operator+после return s
String.h
Код:
friend String operator+ (const String& s1, const String& s2){
		String s(s1);
		s += s2;
		return s;
	};
Unhandled exeption at ...
Не могу понять, в чём дело, всё ведь вроде корректно.

Последний раз редактировалось милица; 03.03.2013 в 02:44.
милица вне форума Ответить с цитированием
Старый 03.03.2013, 02:50   #4
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

---------------------------------------------------------------------
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегрузка оператора^ Voronar Общие вопросы C/C++ 2 03.12.2012 23:26
Перегрузка оператора ifstream >> для класса artemoning Общие вопросы C/C++ 6 05.10.2012 22:38
перегрузка оператора + nesss Помощь студентам 0 01.11.2011 02:23
Перегрузка оператора + z3rg Общие вопросы C/C++ 1 22.03.2009 03:06
Перегрузка оператора + (С++) MjRed Помощь студентам 1 15.12.2008 18:57