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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2011, 18:02   #1
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию Объектно-ориентируемый стиль

Помогите написать функцию ArrayA::AddItem().
Код:
#include <iostream>
#include <vector>

using namespace std;

// Declarations
class BaseItem
{
public:
	BaseItem();
	char *name;	
};

class BaseArray : public vector<BaseItem>
{
public:
	virtual void AddItem();
};

class ItemA : public BaseItem
{
public:
	ItemA();
};

class ArrayA : public BaseArray
{
public:
	void AddItem();
};

// Definitions
void BaseArray::AddItem()
{
}

void ArrayA::AddItem()
{
	//??????????
}

BaseItem::BaseItem()
{
}

ItemA::ItemA()
{
	name = "ItemA";
}

int main()
{
	BaseArray *p = new ArrayA;
	p->AddItem();
	return 0;
}
Заранее благодарен!
KemanSR вне форума Ответить с цитированием
Старый 20.01.2011, 18:17   #2
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Объектно-ориентируемый стиль это сильно :D.

Лично я вообще не понял, что ты хочешь добиться в этом коде.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 20.01.2011, 18:29   #3
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию

Из функции main вызываем AddItem() класса BaseArray. Так-как функция virtual вызывается AddItem() класса ArrayA. Вот в этот класс-массив необходимо добавить объект ItemA, но использовав тот факт что ItemA наследован от BaseItem.
KemanSR вне форума Ответить с цитированием
Старый 20.01.2011, 18:33   #4
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Курите Джеффа Элджера! Там всё написано!
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 20.01.2011, 18:40   #5
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию

Цитата:
Сообщение от Hacker19_90 Посмотреть сообщение
Курите Джеффа Элджера! Там всё написано!
... изза нескольких строчек - нецелесообразно. Если в Ваших силах, помогите.
KemanSR вне форума Ответить с цитированием
Старый 20.01.2011, 18:50   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2KemanSR
сначала объясни, что тебе надо.
1. хочешь хранить полиморфные объекты в контейнере?
2. зачем класс контейнера делать полиморфным?
3. от стандартных контейнеров ничего не наследуют, их считают final классами. используй агрегацию.

+ если хочешь хранить в контейнере полиморфные объекты, то тип хранимого объекта должен быть T *
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 вне форума Ответить с цитированием
Старый 20.01.2011, 18:50   #7
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

ну вот тебе пример из полиморфных контейнеров, в которых лежат полиморфные объекты.
полиморфные контейнеры сами лежат в контейнере для удобной обработки

Код:
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <functional>

using namespace std;

//-----------------------------------------------------------
class BaseItem {
public:
	virtual void print() const
	{ cout << "\tBaseItem" << endl; }
};

//-----------------------------------------------------------
class ConcreteItem : public BaseItem {
public:
	virtual void print() const
	{ cout << "\tConcreteItem" << endl; }
};

//-----------------------------------------------------------
class BaseContainer {
public:
	void AddItem(BaseItem *i)
	{ v.push_back(i); }

	virtual const char *containerName() const
	{ return "BaseContainer"; }

	virtual void printAll() const
	{
		cout << containerName() << endl;
		for_each(v.begin(), v.end(), mem_fun(&BaseItem::print));
		cout << endl;
	}

protected:
	vector<BaseItem *> v;
};

//-----------------------------------------------------------
class ConcreteContainer : public BaseContainer {
public:
	virtual const char *containerName() const
	{ return "ConcreteContainer"; }
};

int main()
{
	vector<BaseContainer *> v;

	BaseContainer *c1 = new BaseContainer;
	BaseContainer *c2 = new ConcreteContainer;

	c1->AddItem(new BaseItem);
	c1->AddItem(new ConcreteItem);
	c1->AddItem(new BaseItem);
	c1->AddItem(new ConcreteItem);

	c2->AddItem(new BaseItem);
	c2->AddItem(new ConcreteItem);

	v.push_back(c1);
	v.push_back(c2);

	for_each(v.begin(), v.end(), mem_fun(&BaseContainer::printAll));

	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; 20.01.2011 в 19:24.
pproger вне форума Ответить с цитированием
Старый 20.01.2011, 19:55   #8
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию

А как сделать чтобы в ConcreteContainer добавлялся только объект ConcreteItem и AddItem() была-бы без аргументов. И ещё из "ямы своей непросвящённости" не вижу большой разницы унаследовать BaseConteiner от vector или создать в BaseConteiner объект того-же vector.

Последний раз редактировалось KemanSR; 20.01.2011 в 20:34.
KemanSR вне форума Ответить с цитированием
Старый 20.01.2011, 22:09   #9
KemanSR
Форумчанин
 
Регистрация: 03.05.2010
Сообщений: 129
По умолчанию

Прошу помощи, может я не правильно формулирую вопрос?
KemanSR вне форума Ответить с цитированием
Старый 20.01.2011, 22:14   #10
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Цитата:
Сообщение от KemanSR Посмотреть сообщение
А как сделать чтобы в ConcreteContainer добавлялся только объект ConcreteItem и AddItem() была-бы без аргументов. И ещё из "ямы своей непросвящённости" не вижу большой разницы унаследовать BaseConteiner от vector или создать в BaseConteiner объект того-же vector.
интересно, как ты собираешься что то добавлять через AddItem, если у этого метода не будет аргументов. научи магии, а.

если тебе не нужны полиморфные контейнеры, значит тебе не надо их наследовать

насчет наследование вектора. если ты не предполагаешь полиморфно использовать наследуемый класс (замещение вирт функций, к примеру), то открытое наследование ни к чему. можно использовать закрытое наследование, но я выбрал агрегацию, ибо тут она более уместна
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 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объектно-ориентированное программирование Solnze2 Помощь студентам 4 14.06.2010 15:32
Объектно-ориентированное программирование Solnze2 Паскаль, Turbo Pascal, PascalABC.NET 0 14.06.2010 10:14
Объектно-ориентированное программирование dzhI Помощь студентам 8 19.03.2009 13:38