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

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

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

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

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

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

Ошибки при компиляции:
Цитата:
1>Лабораторная 2.obj : error LNK2001: неразрешенный внешний символ ""public: virtual void __thiscall figure::Move(float,float)" (?Move@figure@@UAEXMM@Z)"
1>Лабораторная 2.obj : error LNK2001: неразрешенный внешний символ ""public: virtual void __thiscall figure::Show(void)" (?Show@figure@@UAEXXZ)"
1>Лабораторная 2.obj : error LNK2001: неразрешенный внешний символ ""public: virtual void __thiscall figure::Hide(void)" (?Hide@figure@@UAEXXZ)"
1>D:\Белоусов\ТП\Лаба 2\Debug\Лабораторная 2.exe : fatal error LNK1120: 3 неразрешенных внешних элементов

Я хотел сделать на подобии этого примера:


Код:
struct people
{
    virtual ~people(){}
};

template<class T>
class human: public people
{
};

template<class T>
class emploee : public human<T>
{
};

human<int>* aray[4];

int main()
{
    human<int> hi;
    human<double> hd;
    emploee<int> ei;
    
    people* pp[3];
    
    pp[0] = &hi;
    pp[1] = &hd;
    pp[2] = &ei;
    
    return 0;
}
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 12.12.2009, 15:37   #12
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
2ROD


очень просто. пример:
Код:
...

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;	
}
Да здравствует утечка памяти. Кто будет удалять объекты классов B и C?
Я так понимаю, нужно как раз собрать вектор для хранения указателей.
Код:
template <class T>
class ptr_array
{
private:
  T **items;
  int size;
...
};

class Figure
{
...
}
...

int main()
{
  ptr_array<Figure> figures;
  figures.add(new B());
  ...
}
Вполне себе правильное задание. Ничего "левого" в нём не вижу.

Зачем шаблонами объявлены классы square и ему подобные? Что в них такого шаблонного? Там от параметра шаблона даже ничего не зависит

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

Цитата:
Зачем шаблонами объявлены классы square и ему подобные? Что в них такого шаблонного? Там от параметра шаблона даже ничего не зависит
Это "колдунство" я убрал.

Насчет второго примера, я его не совсем понимаю.


Имеется ввиду что-то типа этого?

Код:
template <class T> class ptr_array
{
private:
  T *items[10];
  int size;
public:
	void add(T *item)
		{
		items[size]=item;
		size++;
		}
	ptr_array()
		{
		size=0;
		}

};

int main()
{
	setlocale(LC_ALL, "Russian");
	 ptr_array<figure> figures;
	 figures.add(new ellipse());
	cout<<"Нажмите любую кнопку, для завершения работы программы"<<endl;
	_getch();
	return 0;
}
Дилетант широкого профиля.

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

Последний раз редактировалось ROD; 12.12.2009 в 16:15.
ROD вне форума Ответить с цитированием
Старый 12.12.2009, 16:17   #14
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от ROD Посмотреть сообщение
Имеется ввиду что-то типа этого?
...
Ага. Ну соответственно ptr_array - это хранилище указателей с удалением объектов в деструкторе. vector тут не канает, т.к. он удалит только сами указатели, а не объекты, на которые он указывает. Я так понимаю, что нужно собрать эдакий vector:
Код:
class ptr_array
{
~ptr_array()
{
  for (int i = 0; i < count; ++i)
    delete items[i];
  delete[] items;
}
void add(T *new_item)
{
  items[count++] = new_item;
}
};
count - количество элементов в массиве. Соответственно, там еще перевыделять память придется по необходимости и всё в этом духе.
pu4koff вне форума Ответить с цитированием
Старый 12.12.2009, 16:21   #15
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Перевыделять память мне не придется, ибо в задании конкретно сказано, сколько элементов будет в массиве (по одному объекту каждого класса, кроме базового).

Возникла проблема с добавлением объекта класса "OutLinedMessage"

который является производным не от "figure", а от его потомков "message" и "ellipse".

Цитата:
1>d:\белоусов\тп\лаба 2\лабораторная 2\лабораторная 2.cpp(36) : error C2594: аргумент: неоднозначные преобразования 'OutLinedMessage *' в 'figure *'
1>d:\белоусов\тп\лаба 2\лабораторная 2\лабораторная 2.cpp(36) : error C2243: приведение типов: преобразование "OutLinedMessage *" в "figure *" существует, но недоступно
Дилетант широкого профиля.

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

Последний раз редактировалось ROD; 12.12.2009 в 16:51.
ROD вне форума Ответить с цитированием
Старый 12.12.2009, 17:21   #16
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Про виртуальное наследование посмотри доки. Давно им не пользовался. Вроде бы как-то так должно быть:
Код:
class message: virtual public figure
...
class ellipse: virtual public figure
...

class OutLinedMessage: public ellipse, message
...
pu4koff вне форума Ответить с цитированием
Старый 12.12.2009, 18:00   #17
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Возникло нарушение прав доступа, при вызове функции Show() объекта типа message, причем ошибка в момент вызова функции.


Код:
void show(int id)
		{
		if(items[id])
			{
			items[id]->Show();
			}
		}
Причем у первых двух объектов (square и ellipse) вызов происходит нормально.
Дилетант широкого профиля.

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

А как удалять объекты, у меня при удалении этих объектов с помощью оператора delite возникают ошибки.
Дилетант широкого профиля.

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

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

Сейчас код выглядит так:

main.cpp - главная функция здесь
Код:
// Лабораторная 2.cpp : Defines the entry point for the console application.
//


#include "conio.h"
#include "VisibleArray.h"
#include <iostream>

using namespace std;

int main()
{
	setlocale(LC_ALL, "Russian");

	VisibleArray<figure> figures;
	figures.Add(new ellipse());
	figures.Show(0);
	cout<<endl;
	figures.Add(new square());
	figures.Show(1);
	cout<<endl;
	figures.Add(new message("Здесь могла быть ваша реклама"));
	figures.Show(2);
	cout<<endl;

	figures.Add(new OutLinedMessage("Здесь тоже могла быть ваша реклама"));
	figures.Show(3);
	cout<<endl;

	figures.Add(new rectangle());
	figures.Show(4);
	cout<<endl;

	cout<<"Нажмите любую кнопку, для завершения работы программы"<<endl;
	_getch();
	return 0;
}
VisibleArray.h - сам шаблон-массив (или какое-то его подобие). Что бы воспроизвести "эффект" надо раскомментировать код в деструкторе.
Код:
#include "clases.h"


template <class T> class VisibleArray
{
private:

	//Начало блока служебных переменных класса
	T *items[10];//по одному объекту каждого класса.
	int size;
	//конец блока служебных переменных класса

public:

	VisibleArray()
		{

		for(int i=0;i<10;i++)
			{
			items[i]=0;
			size=0;
			}
		}

	~VisibleArray()
		{
		//RemoveAll();
		}

	void Add(T *item)						//добавляет указатель в конец массива;
		{
		if(size<10)
			{
			items[size]=item;
			size++;
			}
		}

	void RemoveLast()						// удаляет последний элемент из массива;
		{
		delete items[size-1];
		items[size-1]=0;
		size--;
		}

	void RemoveAll()						// удаляет все элементы из массива;
		{
		while(size>0)
			{
			RemoveLast();
			}
		}

	void Show(int id)						// делает видимым элемент с указанным номером;
		{
		items[id]->Show();
		}

	void Hide(int id)						// делает невидимым элемент с указанным номером;
		{
		items[id]->Hide();
		}

	void Move(int id, float dx, float dy)	// перемещает на заданные расстояния по Х и Y элемент с указанным номером;
		{
		items[id]->Move(dx,dy);
		}

	void SetNewColor(int id, RGB new_color)	// изменяет цвет элемента на заданный;
		{
		items[id]->color=new_color;
		}
	
	void ShowAll()							// делает видимыми все элементы;
		{
		for(int i=0;i<size;i++)
			{
			Show(i);
			}
		}
	
	void HideAll()							// делает невидимыми все элементы;
		{
		for(int i=0;i<size;i++)
			{
			Hide(i);
			}
		}

	void MoveAll(float dx, float dy)		// перемещает на заданные расстояния по Х и Y все элементы;
 		{
		for(int i=0;i<size;i++)
			{
			Move(i,dx,dy);
			}
		}

	void SetNewColorAll(RGB new_color)		// изменяет цвет всех элементов на заданный;
		{
		for(int i=0;i<size;i++)
			{
			SetNewColor(i,new_color);
			}
		}
};
Дилетант широкого профиля.

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

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