Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 26 из 87<  1 ... 23  24  25  26  27  28  29 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Такой вопрос появился. У меня есть класс, который содержит и обрабатывает каким-то образом данные. И допустим мне надо выводить их на экран. В текущем проекте я использую OpenGL. И функцию вывода на экран я встраиваю в класс, допустим MyClass::Draw_with_OpenGL(). Но потом, в другой программе мне может вообще надо будет выводить его только в двухмерном виде, я опять должен добавлять функцию MyClass::Draw_with_GDI(). А потом может быть буду использовать вообще DirectX, и так далее.. Что, мне нужно хранит все эти функции вывода в классе? Но это же неэффективно.. А пользоваться обычными функциями, не встроенными в класс тоже неправильно, удобнее намного, когда функция рисования является членом класса. Как лучше сделать?



Партнер
 

Member
Статус: Не в сети
Регистрация: 05.01.2005
kexman
kexman писал(а):
Как лучше сделать?

Просмотреть пару приличных книг (статей) по ООП, где найти и обратить внимание на полиморфизм (polymorphism).


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
_SGK
спасибо! буду рыть!


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman фактически тебе лучше сделать как. Иметь некий абстрактный класс IAbstractRenderer:
Код:
class IAbstractRenderer
{
public:
    virtual bool LoadRenderer() = 0;
    virtual void CloseRenderer() = 0;
    virtual void RenderObject(MyObject *object);
};


Далее для OpenGL к примеру класс:
Код:
class OpenGLRenderer: public IAbstractRenderer
{
public:
    virtual bool LoadRenderer() = 0;
    virtual void CloseRenderer() = 0;
    virtual void RenderObject(MyObject *object);
};

Следственно для GDI:
Код:
class GDIRenderer: public IAbstractRenderer
{
public:
    virtual bool LoadRenderer() = 0;
    virtual void CloseRenderer() = 0;
    virtual void RenderObject(MyObject *object);
};


Теперь при старте программы, ты допустим читаешь настройки и делаешь такую простую вещь с использованием апкаста:

Код:
enum RenderType
{
    OGLRender = 1
    GDIRender
};

.
.
.
IAbstractRenderer *renderer = NULL;
if (renderType_ == OGLRender)
{
    renderer = new OpenGLRenderer();
}
else if (renderType_ == GDIRender)
{
    renderer = new GDIRenderer();
}

renderer->LoadRenderer();

Добавлено спустя 3 минуты, 58 секунд
Вот это и есть применение полиморфизма. Желательно использовать в этом случае паттерн, который предложил Герб Саттер, - Non-Virtual Interface (вообще его книги должны быть настольными у любого плюсовика :)).

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 11.04.2004
Откуда: СПБ
nickyoz писал(а):
Паттерны не есть вещи, привязаные токо к програмированию

I know. Но кхм... проектирование... это ведь не сразу :)
Daemon писал(а):
Герб Саттер, - Non-Virtual Interface

брр.. есть еще другие названия? У меня книжка Гаммы, там немного другие обозначения :)


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Catar писал(а):
есть еще другие названия? У меня книжка Гаммы, там немного другие обозначения
Это не паттерн ГОФ, это паттерн Саттера, напоминает Template Method.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon
Спасибо! Но вопрос, у меня объектов для рисования много и для каждого нужна своя функция RenderObject. Все объекты наследованы от одного. Нужно в классах Renderer перегружать функцию для каждого типа объекта?


 

Member
Статус: Не в сети
Регистрация: 11.04.2004
Откуда: СПБ
kexman писал(а):
Нужно в классах Renderer перегружать функцию для каждого типа объекта?

да. И опять таки, это называется не перегрузка (overload), а override...
Все-таки прочитай про полиморфизм :)


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Catar
У меня в книге это называется перегрузкой.
В какой книге читать про полиморфизм? В тех, что есть у меня как-то мутно описано...


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Catar писал(а):
да. И опять таки, это называется не перегрузка (overload), а override...
Нет, это можно будет убица об стену, если для каждого типа объекта свой рендерер. Проще когда рендерер рисует примитивы, а каждый класс объекта имеет свою функцию рендер, которая рисует объект с помощью функций рендерера. Т.е. каждый объект рисует себя сам (так например в PainKiller сделано :)).

_________________
Ку ку


 

Junior
Статус: Не в сети
Регистрация: 04.05.2006
Откуда: Чайковский.
Какой функцией можно получить символ по его коду ASCII??

_________________
Никогда не говори никогда!


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon
То есть в рендерере определять реализацию примитивных функций типа vertex, triangle, strip и т. д. А в своем классе использовать эти примитивы.
Только вот эти функции, типа line(x1,y1,x2,y2) лучше объявлять как просто функции или в составе объекта и как лучше?


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
jeki гы, а как ты думаешь, что будет выведено:
Код:
char a = 65;
printf("%c\n", a);


kexman ну как же просто функции, они же используют какие-то свойства рендера (типа хендлов), естественно нужно инкапсулировать в класс, иначе не избежать глобальных переменных.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
Daemon
И вызывать эти функции как renderer->line(x1,y1,x2,y2) ? Не очень ведь удобно!


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Непонимаб в чем неудобство, эти функции рисуют примитивы, где же как не в классе рендерера их розмещать.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 12.12.2003
Откуда: Уфа
И по производительности же так будет не очень? Какждый раз вызывать лишние функции. или делать inline?


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
kexman ну ты прям как Кармак, честное слово :D Ты на С пишешь или С++? Объекты сами по себе - это накладные расходы по памяти. Любое проектное решение связанное с применением ООП несет в себе лишние расходы, но:
1. Облегчает расширяемость.
2. Обеспечивает повторное использование кода.
3. Облегчает дальнейшую поддержку продукта и исправления багов.

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

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 11.04.2004
Откуда: СПБ
Daemon писал(а):
это можно будет убица об стену, если для каждого типа объекта свой рендерер. Проще когда рендерер рисует примитивы, а каждый класс объекта имеет свою функцию рендер, которая рисует объект с помощью функций рендерера. Т.е. каждый объект рисует себя сам

ну да :) я под рендерером подразумевал метод. kexman'a не сразу поймешь :)
kexman писал(а):
У меня в книге это называется перегрузкой.

блин я просто не понял тебя...
Код:
abstract class Shape {
 virtual void drawMe() = 0;
};
class Triangle : Shape {
 virtual void drawMe();
}

Ну и соответственно в drawMe писать вызовы рендерера
кажется об этом писал Daemon.
Добавлено спустя 4 минуты, 9 секунд
kexman писал(а):
Какждый раз вызывать лишние функции.

млин с таким подходом.... если тебе дать жавный код, ты ужаснешься - там одни вызовы :)


 

Advanced member
Статус: Не в сети
Регистрация: 09.03.2004
Откуда: Кишинёв
_nic писал(а):
Неработает борланд и 5 и 6 матюкаются что "Undefined structure _finddata_t " Также он незнает не _findfirst не остальных ф-ций начинающихся с подчеркивания А я вроде все что надо подключил

Попробуй убрать подчёркивания. Это же ран-тайм - должно работать без телодвижений. Вероятно в борланде проблема :) .


 

Junior
Статус: Не в сети
Регистрация: 04.05.2006
Откуда: Чайковский.
надеюсь последний глупый вопрос с моей стороны. Нужно организовать посимвольный ввод строки с клавиатуры с проверкой символов т.е. вводить только буквы, цифры отбрасывать. Но как обычно почему то не работает.
Код:
# include   <iostream.h>
# include   <math.h>
# include   <conio.h>
# include   <string.h>


 char aaa[20];

 char read()
   {
    char *a,aa[20]="";
    while (*a!=13)
     {
       *a=getch();
       if (*a!=13)
       strcat(aa,a);
     }

   strcat(aa,"\0");
   return(*aa);
   }

void main ()
  {
   clrscr();
   *aaa=read();
   cout<<"\n"<<aaa;
  }

_________________
Никогда не говори никогда!


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 26 из 87<  1 ... 23  24  25  26  27  28  29 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan