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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2009, 14:50   #1
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию Шаблоны. Массив-шаблон.

Встретил в лабораторной такой пункт
Цитата:
Создать шаблон-массив указателей на объекты, которые должны на экране строить свое изображение. При запуске программы автоматически поместить в массив по одному элементу всех вышеперечисленных классов, кроме Figure.
Перечисленными классами являются классы с именами
Цитата:
Circle – класс “Окружность”
Square – класс “Квадрат”
Message – класс “Текстовая строка”
OutLinedMessage - класс “Текстовая строка в квадратной рамке внутри круга”
Что вообще из себя представляют шаблоны, и как их, в данном случае, можно применить?

Мои догадки:

Код:
template <class Circle,class Square,class Message,class OutLinedMessage> class VisibleArray
{
//некоторые функции, думаю, с ними проблем у меня возникнуть не должно.
    Add();
    RemoveLast();
    RemoveAll();
    Show();
    Hide();
    Move ();
    SetNewColor ();
    ShowAll ();
    HideAll ();
    MoveAll();
    SetNewColorAll ();
    VisibleArray();
    ~VisibleArray();
};
Дилетант широкого профиля.

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

Последний раз редактировалось ROD; 02.12.2009 в 14:56. Причина: `
ROD вне форума Ответить с цитированием
Старый 02.12.2009, 15:14   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

не понятно, зачем тут шаблоны нужны, ибо тут за километр несет наследованием через общий интерфейс (абстрактный класс).

в твоем случае думаю тебе нужно сделать что то типо std::vector<YouObject*>. Почитай про шаблоны, разберись, как работает вектор и все станет понятно.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 02.12.2009, 15:23   #3
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Наследование через общий класс тут действительно есть, но как это применить, для помещения всех этих радостей в один массив/список, мне не ясно.

Что касается шаблона-массива - такой текст задания.

*ушел читать про шаблоны"
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 02.12.2009, 15:56   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2ROD
Цитата:
Наследование через общий класс тут действительно есть, но как это применить, для помещения всех этих радостей в один массив/список, мне не ясно.
очень просто. пример:
Код:
#include <iostream>
#include <vector>

class A {
public:
	virtual void doWork() = 0;
};

class B : public A {
public:
	virtual void doWork() {
		std::cout << "class B is working" << std::endl;
	}
};

class C : public A {
public:
	virtual void doWork() {
		std::cout << "class C is working" << std::endl;
	}
};

int main () {
	std::vector<A*> m_List;
	m_List.push_back(new B());
	m_List.push_back(new C());
	m_List.push_back(new B());
	m_List.push_back(new C());

	std::vector<A*>::const_iterator It;
	for (It = m_List.begin(); It != m_List.end(); It++) {
		(*It)->doWork();
	}
	return 0;	
}
я так понял, тебе нужно сделать такой же эффект, но на шаблонах? яб поругался с преподом как минимум)
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 02.12.2009, 16:13   #5
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
я так понял, тебе нужно сделать такой же эффект, но на шаблонах? яб поругался с преподом как минимум)
Да, вы меня правильно поняли.

P.S.
Я бы тоже с преподом поругался, но она человек старый, и задачи не она составляла.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 02.12.2009, 16:16   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2ROD
понимаешь, в таком случае тебе каким то образом придется следить за реализацией всех методов в каждом классе, который ты собираешься вызывать из шаблона, иначе будешь получать очень страшные ошибки компиля. тут же за этим следит чисто виртуальная функция.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 02.12.2009, 19:59   #7
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

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

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 02.12.2009, 20:02   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Может быть не пустой, а не реализующий своих методов? Так обычно и задаются интерфейсы, как это видно из приведённого pproger'ом кода
netrino вне форума Ответить с цитированием
Старый 02.12.2009, 20:28   #9
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
Figure – виртуальный базовый класс.
Вполне может быть, что в него действительно надо воткнуть некоторые базовые функции (тогда не понятно, зачем эти базовые функции указывать в качестве функций-членов (в задании, имеется ввиду), они ведь так и так будут, ну может быть где-то их придется пере реализовать).
Дилетант широкого профиля.

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

Последний раз редактировалось ROD; 02.12.2009 в 20:31.
ROD вне форума Ответить с цитированием
Старый 12.12.2009, 15:02   #10
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

В общем поиск адекватных результатов не дал, либо я не правильно понимаю вообще саму суть понятия шаблон-массив.

Что я сейчас имею:

Код:
#include "conio.h"
#include "VisibleArray.h"
#include <iostream>

using namespace std;


int main()/Главная функция, по большому счету, в данный момент, вообще ничего не делает.
{
	setlocale(LC_ALL, "Russian");
	cout<<"Нажмите любую кнопку, для завершения работы программы"<<endl;
	_getch();
	return 0;
}
Это файл VisibleArray.h
Код:


#include "clases.h"
//далее не написаный класс VisibleArray
Это файл 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);
	virtual void Show();
	virtual void Hide();
};
template <class T> class square:public figure
{
public:
	point position;
	RGB color;
	float a;
	square();
	~square();
	void Move(float dx,float dy);
	virtual void Show();
	virtual void Hide();
};
template<class T> class ellipse:public figure
{
public:
	point position;
	RGB color;
	float r;
	ellipse();
	~ellipse();
	virtual void Move(float dx,float dy);
	virtual void Show();
	virtual void Hide();
};

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



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

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


void ellipse<class T>::Hide()
{
system("cls");
}

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

ellipse<class T>::~ellipse()
{

}




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

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


void square<class T>::Hide()
{
system("cls");
}

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

square<class T>::~square()
{

}

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

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


void message<class T>::Hide()
{
system("cls");
}

message<class T>::message()
{
	text[0]='\0';
	position.x=0;
	position.y=0;
	color.r=255;
	color.g=255;
	color.b=255;
}

message<class T>::message(char *tparam)
{
	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<class T>::~message()
{

}

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

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


void OutLinedMessage<class T>::Hide()
{
system("cls");
}

OutLinedMessage<class T>::OutLinedMessage()
{
	text[0]='\0';
	position.x=0;
	position.y=0;
	color.r=255;
	color.g=255;
	color.b=255;
}

OutLinedMessage<class T>::OutLinedMessage(char *tparam)
{
	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<class T>::~OutLinedMessage()
{

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

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

Последний раз редактировалось ROD; 12.12.2009 в 15:36.
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