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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2011, 22:42   #1
EC.cpp
Пользователь
 
Регистрация: 09.04.2011
Сообщений: 30
По умолчанию Перегрузка бинарного оператора +

Доброго времени суток!
Возможно есть у кого-то опыт перегрузки бинарного + при работе со строками. Удается прописать + пока только унарным способом, но программа по выходу из функции перегрузки вызывает деструктор и значение где-то там теряется. Процедура и объявления следующие:
Код:
//---------------------Overloads.h

#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <stdlib.h>

class string
{
public:
	string(void);
	string(TCHAR*);
	void ConsoleOut(void);
	inline TCHAR* GetString(void) {return S;}
	inline unsigned int GetLenth(void) {return Lenth;}
	inline void SetLenth(unsigned int len) {Lenth = len;}
	string& operator = (TCHAR *val);
	string& operator = (string& str);
	string& operator + (string& add);
	~string(void);

private:
	TCHAR *S;
	unsigned int Lenth;
};

//---------------------Overloads.cpp
//Destructor
string::~string(void)
{
		delete[] S;
}

//Инициализация строки данными
string& string::operator = (string& str)
{
	unsigned int i;
	TCHAR *s1, *s2;
	if(S)
		delete[] S;
	S = new TCHAR[str.GetLenth() + 1];
	s1 = S;
	s2 = str.GetString();
	for (i=0; i<str.GetLenth(); i++)
		*(s1++) = *(s2++);
	*(s1) = '\0';
	return (*this);
}

//Реализация перегрузки 
string& string::operator + (string& add)
{
	TCHAR *N, *copy, *dest;
	N = new TCHAR[Lenth + add.GetLenth() + 1];
	dest = N;
	copy = this->GetString();
	while ( *(copy) != '\0')
		*(dest++) = *(copy++);
	copy = add.GetString();
	while( *(copy) != '\0')
		*(dest++) = *(copy++);
	*(dest) = '\0';
	string Result = string(N);
	return Result;
}
EC.cpp вне форума Ответить с цитированием
Старый 09.04.2011, 22:55   #2
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

ну начнем с того что временное значение нельзя возвратить по ссылке, попробуйте вернуть по значению.
кроме того определите КК, он вам понадобится.
onewho вне форума Ответить с цитированием
Старый 09.04.2011, 23:04   #3
EC.cpp
Пользователь
 
Регистрация: 09.04.2011
Сообщений: 30
По умолчанию

Цитата:
Сообщение от onewho Посмотреть сообщение
ну начнем с того что временное значение нельзя возвратить по ссылке, попробуйте вернуть по значению.
кроме того определите КК, он вам понадобится.
К сожалению не очень силен в сленге, насколько понимаю КК - конструкторы, в таком случае они здесь:
Код:
//---------------------------Overloads.cpp
//Constructors
string::string(void)
{
	S = NULL;
	Lenth = 0;
}

string::string(TCHAR *data)
{
	unsigned int size, i;
	TCHAR *str, *buf;
	buf = data;
	size = 0;
	while( *(buf++) != '\0')
		size += 1;
	Lenth = size;
	S = new TCHAR[size + 1];
	str = S;
	buf = data;
	for (i=0; i<size; i++)
		*(str++) = *(buf++);
	*(str) = '\0';
}
EC.cpp вне форума Ответить с цитированием
Старый 09.04.2011, 23:06   #4
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
КК - конструкторы
Конструктор копирования.
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 10.04.2011, 00:32   #5
EC.cpp
Пользователь
 
Регистрация: 09.04.2011
Сообщений: 30
Смех

Цитата:
Сообщение от onewho Посмотреть сообщение
ну начнем с того что временное значение нельзя возвратить по ссылке, попробуйте вернуть по значению.
кроме того определите КК, он вам понадобится.
Цитата:
Сообщение от Сtrl Посмотреть сообщение
Конструктор копирования.
Всем спасибо за дельные советы и разъяснения, действительно после добавления КК и возврата по значению:
Код:
//-------------------Overloads.cpp
//Copy constructor
string::string(string& obj)
{
	TCHAR *s1, *s2;
	if(this != &obj)
	{
		S = new TCHAR[obj.GetLenth() + 1];
		s1 = this->S;
		s2 = obj.GetString();
		while( *(s2) != '\0')
			*(s1++) = *(s2++);
		*(s1) = '\0';
		Lenth = obj.GetLenth();
	}
}

//Унарная перегрузка операции +
string string::operator + (string& add)
{
	TCHAR *N, *copy, *dest;
	N = new TCHAR[Lenth + add.GetLenth() + 1];
	dest = N;
	copy = this->GetString();
	while ( *(copy) != '\0')
		*(dest++) = *(copy++);
	copy = add.GetString();
	while( *(copy) != '\0')
		*(dest++) = *(copy++);
	*(dest) = '\0';
	string Result(N);
	return Result;
}
В том числе теперь абсолютно адекватно отрабатывает деструктор:
Код:
//Destructor
string::~string(void)
{
	delete[] S;
}
Всё более менее прояснилось.
EC.cpp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перегрузка оператора = mcpro Общие вопросы C/C++ 8 04.02.2011 15:28
Перегрузка оператора + Jane-sad Помощь студентам 0 05.10.2010 13:52
перегрузка оператора << z3rg Общие вопросы C/C++ 18 02.03.2010 02:58
Перегрузка оператора + z3rg Общие вопросы C/C++ 1 22.03.2009 03:06
Перегрузка оператора + (С++) MjRed Помощь студентам 1 15.12.2008 18:57