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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 14.12.2009, 04:11   #1
Troi666
Пользователь
 
Регистрация: 01.12.2008
Сообщений: 58
По умолчанию [C++] Вывод на экран, контейнерные класссы

Доброго времени суток! Пишу программу... Столкнулся с проблемой при выводе объекта класса на экран, если он находится в контейнерном классе set. Происходит следующее: после вывода 1-го поля объекта, память под остальные поля "изгаживается". Сам код прилагается... Помогите разобраться плиз...уже всю голову сломал

Код:
#include <vcl>
#include <conio>;
#include <iostream>
#include <set>;
using namespace std;

class ASUZD
{
	private:
		int number;
		char * station;
		char * time;
	public:
		ASUZD();
		ASUZD(int, char *, char *);
		~ASUZD();
		bool operator<(const ASUZD &) const;
		friend ostream & operator<<(ostream &, const ASUZD &);
};

ASUZD::ASUZD()
{
	number=0;
	station = new char[7];
	time = new char[5];
	strcpy(station, "NoName");
	strcpy(time, "0:00");
}

typedef set<ASUZD> set_A;

ASUZD::ASUZD(int nb, char * st, char * tm)
{
	number = nb;
	station = new char[strlen(st)+1];
	time = new char[strlen(tm)+1];
	strcpy(station, st);
	strcpy(time, tm);
}

ASUZD::~ASUZD()
{
	delete [] station;
	delete [] time;
}

bool ASUZD::operator<(const ASUZD & Obj) const
{
	if ((this->number)<Obj.number)
		return true;
	return false;
}

ostream & operator<<(ostream & os, const ASUZD & Obj)
{
	os<<Obj.number<<"\t";
	os<<Obj.station<<"\t"<<Obj.time<<"\n";
	return os;
}

void main()
{
	set_A set1;
	set1.insert(ASUZD(123, "Ghokj", "5:67"));
	set_A::iterator i;
	for (i = set1.begin(); i != set1.end(); i++) {
	 cout<<*i<<" ";
	 getch();
	}
}
Troi666 вне форума
Старый 14.12.2009, 04:39   #2
Troi666
Пользователь
 
Регистрация: 01.12.2008
Сообщений: 58
По умолчанию

Проблема найдена, однако решить её не в состоянии: итак... после создания объекта и каких-то манипуляций с классом set вызывается деструктор ASUZD(), который и портит всю малину. Если деструктор убрать - то всё будет работать, однако утечка памяти - "не айс". Собственно что делать?
Troi666 вне форума
Старый 14.12.2009, 05:00   #3
Troi666
Пользователь
 
Регистрация: 01.12.2008
Сообщений: 58
По умолчанию

Проблема решилась добавлением конструктора копирования и перегрузкой оператора присваивания:

Код:
ASUZD & ASUZD::operator=(const ASUZD & Obj)
{
   if (this != &Obj)
   {
      number = Obj.number;
      delete [] station;
      delete [] time;
      station = new char[strlen(Obj.station)+1];
      time = new char[strlen(Obj.time)+1];
      strcpy(station, Obj.station);
      strcpy(time, Obj.time);
   }
   return *this;
}

ASUZD::ASUZD(const ASUZD & Obj)
{
   number = Obj.number;
   station = new char[strlen(Obj.station)+1];
   time = new char[strlen(Obj.time)+1];
   strcpy(station, Obj.station);
   strcpy(time, Obj.time);
}
Troi666 вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вывод на экран Nikolai_90 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 11 02.05.2012 09:25
Вывод на экран tools Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 01.12.2009 22:26
Вывод на экран Timpi Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 30.11.2009 18:05
Вывод на экран Rifler Паскаль, Turbo Pascal, PascalABC.NET 10 18.07.2008 18:30
Вывод на 2-ой экран DShiller Общие вопросы Delphi 0 26.05.2008 15:25