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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2009, 22:45   #21
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

clases.h
Код:
#include <math.h>
#include <windows.h>
#include <iostream>

using namespace std;

struct point
{
float x,y;
};

struct RGB
{
int r,g,b;
};

//------------------------------------------------------------------------------
class figure
{
private:
public:
	virtual void Move(float dx,float dy)=0;
	virtual void Show()=0;
	virtual void Hide()=0;
};
class square:public figure
{
public:
	point position;
	RGB color;
	float a;
	square();
	~square();
	void Move(float dx,float dy);
	void Show();
	void Hide();
};

class ellipse:public virtual figure
{
public:
	point position;
	RGB color;
	float r;
	ellipse();
	~ellipse();
	void Move(float dx,float dy);
	void Show();
	void Hide();
};

class message:public virtual figure
{
public:
	point position;
	RGB color;
	char *text;
	message();
	message(char *tparam);
	~message();
	void Move(float dx,float dy);	
	void Show();
	void Hide();
};

class rectangle:public figure
{
public:
	RGB color;
	point position[2];
	rectangle();
	~rectangle();
	void Move(float dx,float dy);
	void Show();
	void Hide();
};

class OutLinedMessage:public message, ellipse
{
public:
	point position;
	RGB color;
	char *text;
	OutLinedMessage();
	OutLinedMessage(char *tparam);
	~OutLinedMessage();
	void Move(float dx,float dy);
	void Show();
	void Hide();
};
//------------------------------------------------------------------------------------
void ellipse::Move(float dx, float dy)
{
	position.x+=dx;
	position.y+=dy;
}

void ellipse::Show()
{
	cout<<"Я ма-а-аленький кружочек"<<endl<<"Радиус"<<"\t"<<"Координаты"<<endl;
	cout<<r<<"\t"<<position.x<<" | "<<position.y<<endl;
}


void ellipse::Hide()
{
system("cls");
}

ellipse::ellipse()
{
	r=1;
	position.x=0;
	position.y=0;
	color.r=255;
	color.g=255;
	color.b=255;
}

ellipse::~ellipse()
{
	cout<<"Они убили элипс"<<endl;
}




//------------------------------------------------------------------------------------
void square::Move(float dx, float dy)
{
	position.x+=dx;
	position.y+=dy;
}

void square::Show()
{
	cout<<"Я ма-а-аленький квадратик"<<endl<<"Длинна стороны"<<"\t"<<"Координаты"<<endl;
	cout<<a<<"\t"<<position.x<<" | "<<position.y<<endl;
}


void square::Hide()
{
system("cls");
}

square::square()
{
	a=1;
	position.x=0;
	position.y=0;
	color.r=255;
	color.g=255;
	color.b=255;
}

square::~square()
{
	cout<<"Они убили мой квадратик"<<endl;
}

//------------------------------------------------------------------------------------
void message::Move(float dx, float dy)
{
	position.x+=dx;
	position.y+=dy;
}

void message::Show()
{

	cout<<"Я ма-а-аленькая надпись"<<endl;
	cout<<"Координаты"<<endl;
	cout<<position.x<<" | "<<position.y<<endl<<"Содержу следующий текст:"<<endl;
	cout<<text<<endl;
}


void message::Hide()
{
system("cls");
}

message::message()
{
	text=new char[256];
	text[0]='\0';
	position.x=0;
	position.y=0;
	color.r=255;
	color.g=255;
	color.b=255;
}

message::message(char *tparam)
{
	text=new char[256];
	for(int i=0;i<265;i++)
		{
			text[i]=tparam[i];
		}
	position.x=0;
	position.y=0;
	color.r=255;
	color.g=255;
	color.b=255;
}

message::~message()
{
	delete []text;
	cout<<"Они убили текст"<<endl;
}

//------------------------------------------------------------------------------------
void OutLinedMessage::Move(float dx, float dy)
{
	position.x+=dx;
	position.y+=dy;
}

void OutLinedMessage::Show()
{
	cout<<"Я ма-а-аленькая надпись в овале"<<endl;
	cout<<"Координаты"<<"\t"<<"Радиус овала"<<endl;
	cout<<position.x<<" | "<<position.y<<"\t"<<r<<endl<<"Содержу следующий текст:"<<endl;
	cout<<text<<endl;
}


void OutLinedMessage::Hide()
{
system("cls");
}

OutLinedMessage::OutLinedMessage()
{
	text=new char[256];
	text[0]='\0';
	position.x=0;
	position.y=0;
	color.r=255;
	color.g=255;
	color.b=255;
}

OutLinedMessage::OutLinedMessage(char *tparam)
{
	text=new char[256];
	for(int i=0;i<265;i++)
		{
			text[i]=tparam[i];
		}
	position.x=0;
	position.y=0;
	color.r=255;
	color.g=255;
	color.b=255;
}

OutLinedMessage::~OutLinedMessage()
{
	delete []text;
	cout<<"Они убили текст в кружочке"<<endl;
}


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


void rectangle::Move(float dx, float dy)
{
	position[0].x+=dx;
	position[0].y+=dy;
	position[1].x+=dx;
	position[1].y+=dy;
}

void rectangle::Show()
{
	cout<<"Я ма-а-аленький прямоугольник"<<endl<<"\t"<<"Координаты"<<endl;
	cout<<"\t"<<position[0].x<<" | "<<position[0].y<<"\t"<<position[1].x<<" | "<<position[1].y<<endl;
}


void rectangle::Hide()
{
system("cls");
}

rectangle::rectangle()
{
	position[0].x=0;
	position[0].y=0;
	position[1].x=20;
	position[1].y=10;
	color.r=255;
	color.g=255;
	color.b=255;
}

rectangle::~rectangle()
{

}
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 15.12.2009, 22:48   #22
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

При удалении объекта класса "OutLinedMessage" возникает ошибка:

Вообще этот объект и два его предка (с виртуальным наследованием) как-то странно выглядят в дебагере.
P.S.

Извиняюсь за недостаток комментариев.
Изображения
Тип файла: png Ошибка.PNG (14.2 Кб, 32 просмотров)
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 15.12.2009 в 22:58.
ROD вне форума Ответить с цитированием
Старый 16.12.2009, 00:56   #23
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Запустив и просмотрев Ваш код, нашёл пару ошибок, после исправления которых вроде не вылетает Во-первых один недочёт, возьмите за правило, если в классе присутствуют виртуальные методы, то необходимо объявить виртуальный деструктор, пусть даже пустой. В абстрактных классах деструктор всегда должен быть виртуальным
Код:
	virtual ~figure() { }
Иначе, удаляя объект производного класса по указателю на базовый, деструктор производного вызван не будет.
А вот и сами ошибки ) :
Код:
message::message(char *tparam)
{
	text=new char[256];
	for(int i=0;i<265;i++)
		{
			text[i]=tparam[i];
		}
...

OutLinedMessage::OutLinedMessage(char *tparam)
{
	text=new char[256];
	for(int i=0;i<265;i++)
		{
			text[i]=tparam[i];
		}
выход за пределы массива и, как следствие, AV
Кстати, я так понимаю, что тут происходит копирование строки? Чем копировать один в один все символы в цикле, я бы использовал, например, strcpy, меньше вероятности вот так вот ошибиться и более высокое быстродействие:
Код:
text = new char[256];
strcpy(text, tparam);
netrino вне форума Ответить с цитированием
Старый 16.12.2009, 13:50   #24
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Долго не мог понять, что не так у меня в цикле, оказывается два символа местами перепутал (265 вместо 256).

Цитата:
virtual ~figure() { }
Добавил, спасибо, буду знать. Теперь у меня тоже все нормально работает.


P.S.

Правда я сегодня уже успел сдать вчерашнюю, не рабочую, лабу
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 16.12.2009 в 13:54.
ROD вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ шаблоны функции napanin Помощь студентам 2 11.06.2009 19:26
Шаблоны форм Lemo Общие вопросы Delphi 16 09.02.2009 18:49
шаблоны php veter_s_morya PHP 2 17.01.2009 14:55
шаблоны функций с++6.0 tanya Общие вопросы C/C++ 18 20.12.2008 19:39
Шаблоны bondik Общие вопросы C/C++ 10 04.05.2008 09:50