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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2010, 11:00   #1
Sanu0074
 
Аватар для Sanu0074
 
Регистрация: 31.05.2010
Сообщений: 7
По умолчанию C++ Перегрузка операторов. Создать оператор (+) для сложения строк

Помогите с лабораторкой по програмированию, программа представляет собой класс в котором есть функция для отбора из одномерного символьного массива - символов латинского алфавита, нужно добавить (+) перегр.оп. для сложения строк!!! (вроде его надо делать с помощью функции strcpy(), но я незнаю как, помогите!!!!!)


Код:
#include <iostream>
#include <windows.h>
#include <string.h>
using namespace std;

class mass
{
public:
	char str[255];
	void otbor()		//отбор лат символов
	{
		
		cout << "\n Вот строка: \n";
	for ( int i = 0; i < strlen (str) ; i++)
	if ((str[i] > 'A') && (str[i] < 'z'))
		cout << str [ i ];
	}
	mass()
	{
		cout<<endl<<"Вызван конструктор по умолчанию"<<endl;
	}

	
};

int main()
{
	SetConsoleOutputCP(1251);

	mass x;

	cout<<"Введите строку: ";
	cin>>x.str;

	x.otbor();
	cout<<endl;

}

Последний раз редактировалось Stilet; 31.05.2010 в 16:35.
Sanu0074 вне форума Ответить с цитированием
Старый 31.05.2010, 16:12   #2
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

по сабжу, тупо можно написать так:
Код:
#include <iostream>
#include <windows.h>
#include <string.h>
using namespace std;

class mass
{
public:
char str[255];
void otbor()	 //отбор лат символов
{

cout << "\n Вот строка: \n";
for ( int i = 0; i < strlen (str) ; i++)
if ((str[i] > 'A') && (str[i] < 'z'))
cout << str [ i ];
}
mass()
{
cout<<endl<<"Вызван конструктор по умолчанию"<<endl;
}

char* operator+(char *str2)
{
	return strcat(str, str2);	//результат в str
}


};

int main()
{
SetConsoleOutputCP(1251);

mass x;

cout<<"Введите строку: ";
cin>>x.str;

x.otbor();
cout<<endl;

}
а вообще вот что сам смог придумать, думаю не следует забывать об основных позициях ООП - инкапсуляция и т.д и т.п, то есть пользуемся сокрытием данных:

Код:
#include <iostream>
#include <cstring>

using namespace std;

class mass{
public:
	friend ostream &operator<<( ostream& , mass & );		//для вывода
	friend istream &operator>>( istream& , mass & );			//для ввода
	mass(short size = 255);	//стандартный конструктор
	mass(char* _str);			//еще один конструктор
	~mass();						//деструктор
public:		
	char* return_str();			//функция, возвращающая указатель на первый символ
	short return_size();		//функция, возвращающая размер массива
public:
	void selection();				//функция отбора
	mass operator+(mass _str);//функция сложения строк concat
	bool operator=(mass _str);	//функция присвоения строк ( копирования правой части в левую часть )
private:
	//соблюдаем инкапсуляцию (сокрытие данных и использование методов)
	short size;
	char* str;
};

//-----------------------------------//

mass::mass(short _size /*=255*/) : str(NULL), size(0){
	str = new char[_size+1]; //+1 для 0-символа, окончание строки
	str[0] = '\0';
	size=_size;
}

mass::mass(char* _str) : str(NULL), size(0){
	size=strlen(_str);
	str = new char[size+1];
	str[0]='\0';
	strcpy(str, _str);
}

mass::~mass(){

}

void mass::selection(){
	cout << "It's string:" << endl;
	for (unsigned short i=0; i<strlen(str); i++){
		if ( (str[i]>='A') && (str[i]<='z') ){
			cout << str[i];
		}
	}
	cout << endl;
	return;
}

char* mass::return_str(){
	return &str[0];
}

short mass::return_size(){
	return size;
}

mass mass::operator+(mass _str){
	char* sub = new char[size+_str.return_size()+1];
	sub[0]='\0';
	strcpy(sub, str);	//копируем первую строку
	strcat(sub, _str.return_str());	//добавляем вторую
	return mass(sub);
}

bool mass::operator =(mass _str){
	bool flag(false);
	cout << str;
	if (size>=_str.return_size()){
		strcpy(str, _str.return_str());
		flag=true;
	}
	return flag;
}

ostream &operator<<( ostream & ostr , mass &_str ){
	return cout << _str.return_str();
}

istream &operator>>( istream & ostr , mass &_str ){
	return cin >> _str.return_str();
}

void main(){
	mass x(400);
	cout << "Enter the string::" << endl;
	cin >> x;
	x.selection();
	mass x2(200);
	cout << "Enter the string::" << endl;
	cin >> x2;
	x2.selection();
	cout << "Concatenate::" << endl;
	mass x3;
	x3=x+x2;
	cout << x3 << endl;
	return;
}
capta1n вне форума Ответить с цитированием
Старый 31.05.2010, 16:12   #3
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

вообще неплохо было бы использовать определение функций, конструкторов, деструкторов в классе, а их тела давать за классом - на мой взгляд так класс выглядит приятнее и читабельнее

Последний раз редактировалось capta1n; 31.05.2010 в 16:14.
capta1n вне форума Ответить с цитированием
Старый 05.07.2010, 20:37   #4
kidiam
 
Регистрация: 05.07.2010
Сообщений: 4
По умолчанию

В следующем коде возможен выход за пределы границ т.к. строка статична
Цитата:
Сообщение от capta1n Посмотреть сообщение
Код:
char* operator+(char *str2)
{
	return strcat(str, str2);	//результат в str
}
И в другом примере также проблема. В конструкторе есть выделение памяти, а в деструкторе нет! Явная утечка памяти.
Цитата:
Сообщение от capta1n Посмотреть сообщение
Код:
mass::mass(short _size /*=255*/) : str(NULL), size(0){
	str = new char[_size+1]; //+1 для 0-символа, окончание строки
	str[0] = '\0';
	size=_size;
}

mass::mass(char* _str) : str(NULL), size(0){
	size=strlen(_str);
	str = new char[size+1];
	str[0]='\0';
	strcpy(str, _str);
}

mass::~mass(){

}

И та же проблема. При сложении! Выделение памяти есть, а освобождение где и когда?
Цитата:
Сообщение от capta1n Посмотреть сообщение
Код:
mass mass::operator+(mass _str){
	char* sub = new char[size+_str.return_size()+1];
	sub[0]='\0';
	strcpy(sub, str);	//копируем первую строку
	strcat(sub, _str.return_str());	//добавляем вторую
	return mass(sub);
}
Если я не прав - исправьте.
kidiam вне форума Ответить с цитированием
Старый 05.07.2010, 21:29   #5
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

да я даже отрицать не буду
другое дело мне за мой код никто ничего не должен и я никому ничего не должен
моим делом было показать пример реализации, а уж всякие фишки типа "освобождение памяти после использования" пусть сам додумывает, если ему нужно
я понимаю, что это правильно - освобождать динамич. память, но с другой стороны если я постоянно буду писать плевые программы со всеми проверками, выделениями и освобождениями, инициализацией и комментариями всякому, кто пишет "помогите, пожалуста!!! нет времени, нужно к завтрашнему дню", то мне это надоест, потому что за нормальный код, на который тратится определенное количество времени, по сути я не получаю ничего, а писать крутые консольные приложения для непонятно кого я не собираюсь
а пример (и довольно большой и качественный для этой задачи пример на мой взгляд) я предоставить могу
я вообще мог не писать например комментарии, что не очень хорошо, ибо человек просто долго будет разбираться, что к чему, но мог и не писать - многие не пишут
так что вот так
capta1n вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегрузка операторов raspberry Общие вопросы C/C++ 2 06.04.2010 00:19
Перегрузка операторов. Macb3th Общие вопросы C/C++ 5 01.04.2010 21:14
Квадрат - перегрузка операторов ArniLand Общие вопросы C/C++ 1 30.03.2010 23:33
Перегрузка операторов (С++) Перчитель Помощь студентам 1 03.12.2008 18:46
Перегрузка операторов, Организация перегрузки операторов chagin_yav Помощь студентам 2 12.05.2008 09:15