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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.01.2011, 19:02   #1
S1av0k
Пользователь
 
Регистрация: 26.11.2009
Сообщений: 87
Стрелка C++. Тема "Классы"

Необходимо написать собственный класс "строка", используя динамическую память. У меня возникли проблемы в самом начале проектирования: не работают перегруженные операторы ввода/вывода...
Пожалуйста, помогите разобраться что к чему...если можно, поподробнее...
Код:
#include <iostream>
using namespace std;
#include "string.h"

class String
{
	private:
		char *mass;
	public:
		String();
		String(char[]);
		String(const String&);
		~String(){delete []mass;}								//деструктор
		friend ostream& operator << (ostream&,String&);
		friend istream& operator >> (istream&,const String&);
		String& operator += (const char a);	
		String& operator = (const String&);
		int operator () (const char[]);
};

String::String()
	{	
		mass = NULL;
	}

String::String(char p[])
	{
		int length = strlen(p);
		int i = 0;
		mass = new char [length];
		while(p[i])
			{
				mass[i] = p[i];	
				++i;
			}
			
		mass[length] = '\0';
	}	
	
String::String(const String& qw)									//копирующий конструктор
	{
		if (this != &qw)
			{
				int length = strlen(qw.mass);
				mass = new char[length];
				strcpy(qw.mass,this->mass);
			}	
	}	
	
ostream& operator << (ostream &s,String &qw)
	{
		return s << qw.mass;
		cout << "qwer" << endl;
	}	
	
istream& operator >> (istream& s,const String& qw)	
	{
		return s >> qw.mass;	
	}
	
String& String::operator += (const char a)
	{
		int length = strlen(mass);
		mass = new char [length+2];	
		strcpy(this->mass,mass);
		mass[length+2] = '\0';
		return *this;
	}	
	
String& String::operator = (const String& qw)	
	{
		int length = strlen(qw.mass);
		mass = new char [length + 1];	
		strcpy(qw.mass,mass);
		return *this;
	}
	
int String::operator () (const char p[])
	{
		int length = strlen(mass);	
		int k, i = 0;
		const char* pptr = p;
		if (mass[i] && *pptr)
			{
				if (*pptr == mass[i])
					return i;
				else		
					{
						++i;
						++pptr;
					}	
			}
	}	
		
int main (int argc, char *argv[])
{
	String str1;
	String str2("abc");
	
	cout << str1 << endl;
	cout << str2 << endl;
	
	str1 = str2;
	cout << str1 << endl;
	
	str1 += 'D';
	cout << str1 << endl;
	
	cout << "Hello world!" << endl;
	
	return 0;
}
Помог - жми весы
S1av0k вне форума Ответить с цитированием
Старый 19.01.2011, 06:08   #2
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

В глаза бросилась дурацкая опечатка в ostream& operator << (ostream &s,String &qw). Сначала ретарн, потом дебаговое действие. В потоках не разбираюсь, так что по теме не помогу.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 19.01.2011, 12:39   #3
pacniwassano
Пользователь
 
Регистрация: 02.12.2010
Сообщений: 81
По умолчанию

Код:
friend ostream& operator << (ostream &stream, MyClass &obj)
{
        stream << obj.value ...;
        ...
        return stream;
}
pacniwassano вне форума Ответить с цитированием
Старый 19.01.2011, 14:04   #4
S1av0k
Пользователь
 
Регистрация: 26.11.2009
Сообщений: 87
По умолчанию

Спасибо, но не помогло тут видимо в чем-то другом проблема...

Понял. В перегруженном операторе вывода не было проверки на то, что строка может быть пустой(что и происходит при создании объекта класса пустым конструктором). Исправил на это:
Код:
ostream& operator << (ostream &s,String &qw)
	{
		if (qw.mass)
			s << qw.mass;
		else
			s << "Cтрока пустая.";	
		return s;
	}
Допустимо ли это?

И ещё остается вопрос по поводу оператора ввода...так и не придумал что сделать, чтобы он заработал...прошу помощи!

Исправил копирующий конструктор:
Код:
String::String(const String& qw)									//копирующий конструктор
	{
		if (this != &qw)
			{
				int length = strlen(qw.mass);
				mass = new char[length];
				strcpy(mass,qw.mass);
			}	
	}
Помог - жми весы

Последний раз редактировалось Stilet; 20.01.2011 в 07:51.
S1av0k вне форума Ответить с цитированием
Старый 19.01.2011, 20:49   #5
S1av0k
Пользователь
 
Регистрация: 26.11.2009
Сообщений: 87
По умолчанию

Всё исправил, всё работает
Прошу помощи только с оператором ввода!
Помог - жми весы
S1av0k вне форума Ответить с цитированием
Старый 19.01.2011, 21:36   #6
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Твой код чреват утечками памяти, не забывай про delete.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 19.01.2011, 22:39   #7
S1av0k
Пользователь
 
Регистрация: 26.11.2009
Сообщений: 87
По умолчанию

Цитата:
Сообщение от Obey-Kun Посмотреть сообщение
Твой код чреват утечками памяти, не забывай про delete.
Например, где?...

В конечном варианте программы всё учтено, память не теряется
Помогите только с перегрузкой оператора ввода в поток!
Помог - жми весы

Последний раз редактировалось Stilet; 20.01.2011 в 07:52.
S1av0k вне форума Ответить с цитированием
Старый 19.01.2011, 22:57   #8
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Да хоть в вышеприведённом тобой
Код:
String::String(const String& qw)									//копирующий конструктор
	{
		if (this != &qw)
			{
				int length = strlen(qw.mass);
				mass = new char[length];
				strcpy(mass,qw.mass);
			}	
	}
Перед заменой значения mass надо сделать delete mass. Иначе это утечка памяти.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 19.01.2011, 23:13   #9
S1av0k
Пользователь
 
Регистрация: 26.11.2009
Сообщений: 87
По умолчанию

Уже учел
Дело только за перегрузкой оператора ввода...
Кстати, Obey-Kun, а как Вы пишете собственные классы, если не умеете перегружать операторы ввода/вывода?
Помог - жми весы
S1av0k вне форума Ответить с цитированием
Старый 20.01.2011, 00:00   #10
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

И если
Код:
переменная = new тип[число];
То освобождать надо с помощью delete[]
Код:
delete[] переменная;
Если delete без скобочек, то освобождается только первый элемент массива... А остальные остаются ! Такая память называется мусором)))

Последний раз редактировалось An1ka; 20.01.2011 в 00:03.
An1ka вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
классы вида for="..." и class="A B C" Darkstar100 HTML и CSS 5 19.01.2010 20:06
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04