Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Множество классов с одинаковым функционалом, но разными свойствами 
:(
    Опции темы
Anton Vatchenko
Дата 2.9.2010, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



Итак, есть некий базовый класс:
Код

class Object
{
public:
    virtual void func() = 0;
};

От него идет целая иерархия классов, типа:
Код

class Car : public Object
{
public:
    virtual void func() { int c = 2; c++; ... }

private:
    int m_r, m_speed;
}

То есть имеем допустим миллион экземпляров "машин" (Car), при этом известно что у всех у них одинаковый функционал, но у каждой свой радиус колес, мощность, выносливость. Нет смысла для каждого экземпляра определять отдельно все эти данные, потому как известно, что среди этого миллиона машин всего 20 характерных типов (Волга, Мерс, БМВ и т.п.) Как данное реализовать, только без создания 20 разных классов, ну кроме указателя на std:map свойств - необходимо делать быстрое чтение этих данных.

Это сообщение отредактировал(а) Anton Vatchenko - 2.9.2010, 15:37


--------------------
user posted image
PM MAIL   Вверх
azesmcar
Дата 2.9.2010, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Anton Vatchenko @  2.9.2010,  15:35 Найти цитируемый пост)
среди этого миллиона машин всего 20 характерных типов (Волга, Мерс, БМВ и т.п.) Как данное реализовать

а чем отличается класс Волга от класса BMW?

PM   Вверх
Anton Vatchenko
Дата 2.9.2010, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



Радиусом колес, мощностью. Ну всеми свойствами авто. Но 10 волг между собой отличаются только позицией, ну и текущей скоростью. Радиус, мощность у них одна. Ну и функционал у всех машин один.

Это сообщение отредактировал(а) Anton Vatchenko - 2.9.2010, 15:46


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 2.9.2010, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Anton Vatchenko @  2.9.2010,  14:35 Найти цитируемый пост)
Как данное реализовать, 

милльен вариантов. Все зависит от решаемой задачи. 




--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 2.9.2010, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Anton Vatchenko @  2.9.2010,  15:45 Найти цитируемый пост)
Радиусом колес, мощностью. Ну всеми свойствами авто. 

Цитата(Anton Vatchenko @  2.9.2010,  15:45 Найти цитируемый пост)
Ну и функционал у всех машин один.

т.е. как класс ничем не отличается, отличаются лишь значение полей.


Это сообщение отредактировал(а) azesmcar - 2.9.2010, 15:47
PM   Вверх
Anton Vatchenko
Дата 2.9.2010, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



Очень хотелось бы хоть один, с минимальным количеством подводных камней (кастинг, map свойств и т.п.)

То есть имеем 5 волг, 10 бмв, 3 мерса. Все они имеют разные позиции, но у всех волг один радиус колес, у всех бмв - другой, у всех мерсов - третий. Ну и у всех у них один функционал, просто однажды вызывается типа createWheels(m_typeRadius).

Это сообщение отредактировал(а) Anton Vatchenko - 2.9.2010, 15:49


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 2.9.2010, 15:48 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Anton Vatchenko @  2.9.2010,  14:45 Найти цитируемый пост)
Радиусом колес, мощностью. Ну всеми свойствами авто. 

если только этим, то не зачем плодить дополнительные классы. 
достаточно сделать несколько _инициализаторов_ приводящих объект Car в нужное состояние.

Добавлено через 48 секунд
Цитата(Anton Vatchenko @  2.9.2010,  14:47 Найти цитируемый пост)
Очень хотелось бы хоть один, с минимальным количеством подводных камней

задачу в студию smile


--------------------
PM MAIL WWW   Вверх
Anton Vatchenko
Дата 2.9.2010, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



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


--------------------
user posted image
PM MAIL   Вверх
djamshud
Дата 2.9.2010, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



Код

class car_iface{};

class volga{};

class bmw{};

class volga3110:public car_iface,public volga{};


Это самый простой способ, полностью реализованный на одной лишь объектной модели С++. В принципе можно волгу наследовать от интерфейса кар, а волгу-3110 только от волги, но первый вариант мне кажется более гибким.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Anton Vatchenko
Дата 2.9.2010, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



Цитата(Anton Vatchenko @  2.9.2010,  15:35 Найти цитируемый пост)
только без создания 20 разных классов

Если учесть, что марок машин 20, у каждой по 10-20 моделей, то программирование класса для каждой займет месяц.

Это сообщение отредактировал(а) Anton Vatchenko - 2.9.2010, 15:56


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 2.9.2010, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Anton Vatchenko @  2.9.2010,  14:54 Найти цитируемый пост)
Если учесть, что марок машин 20, у каждой по 10-20 моделей, то программирование класса для каждой займет месяц.

лови и пили :
Код


typedef int wheel_size_t;
typedef int engine_power_t;

class car
{ 
  public:
       struct descriptor_t
       {
             const char *      name;     
             wheel_size_t      wheel_size;
             engine_power_t    engine_power;
//            ...
       };
      car (descriptor_t const& d) : m_descriptor (d) {}
        
  private:
      const descriptor_t& m_descriptor;                   
};

const car::descriptor_t d_car1 = { "car_name_1", 14, 200 };
const car::descriptor_t d_car2 = { "car_name_2", 15, 260 };
const car::descriptor_t d_car3 = { "car_name_3", 15, 250 };




--------------------
PM MAIL WWW   Вверх
Anton Vatchenko
Дата 2.9.2010, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



А что делать с производными классами? Вот к примеру от Car порождены Car3Wheel, Car4Wheel, у которых могут быть еще свои свойства, частично функционал из Car, а частично из себя?


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 2.9.2010, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Anton Vatchenko @  2.9.2010,  15:05 Найти цитируемый пост)
 Car3Wheel, Car4Wheel, 

добавьте в дескриптор поле, о том сколько колес.

Более полно решить задачу не зная задачи, проблематично.. 
Первоначально надо  представить что есть автомибиль и какие задачи он должен решать.
Т.е. автомобиль с точки зрения завода, его производящего, такси-фирмы, и простого пользователя , абсолютно различны и отражать все это в одной модели не имеет смысла 
smile


--------------------
PM MAIL WWW   Вверх
Anton Vatchenko
Дата 2.9.2010, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



то есть может получиться типа
Код

class Bicycle
{
    const BicycleDescriptor& m_data;
}

class Car : public Bicycle
{
    const CarDescriptor& m_data;
}

которые "увеличат" размер класса, так как в Car будет как бы дважды m_data.

Добавлено через 40 секунд
Задача дана в первом посте, полностью.


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 2.9.2010, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Anton Vatchenko @  2.9.2010,  15:11 Найти цитируемый пост)
которые "увеличат" размер класса, так как в Car будет как бы дважды m_data. 

это можно обойти smile 

но Вы уверены, что Car это наследник Bicycle ?!

Добавлено через 3 минуты и 33 секунды
Цитата(Anton Vatchenko @  2.9.2010,  15:11 Найти цитируемый пост)
Задача дана в первом посте, полностью. 

то что описано в первом посте, полностью решается приведенным примером.




--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1625 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.