Member
Статус: Не в сети Регистрация: 12.12.2003 Откуда: Уфа
Такой вопрос появился. У меня есть класс, который содержит и обрабатывает каким-то образом данные. И допустим мне надо выводить их на экран. В текущем проекте я использую OpenGL. И функцию вывода на экран я встраиваю в класс, допустим MyClass::Draw_with_OpenGL(). Но потом, в другой программе мне может вообще надо будет выводить его только в двухмерном виде, я опять должен добавлять функцию MyClass::Draw_with_GDI(). А потом может быть буду использовать вообще DirectX, и так далее.. Что, мне нужно хранит все эти функции вывода в классе? Но это же неэффективно.. А пользоваться обычными функциями, не встроенными в класс тоже неправильно, удобнее намного, когда функция рисования является членом класса. Как лучше сделать?
Теперь при старте программы, ты допустим читаешь настройки и делаешь такую простую вещь с использованием апкаста:
Код:
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
Статус: Не в сети Регистрация: 12.12.2003 Откуда: Уфа
Daemon Спасибо! Но вопрос, у меня объектов для рисования много и для каждого нужна своя функция RenderObject. Все объекты наследованы от одного. Нужно в классах Renderer перегружать функцию для каждого типа объекта?
Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
Catar писал(а):
да. И опять таки, это называется не перегрузка (overload), а override...
Нет, это можно будет убица об стену, если для каждого типа объекта свой рендерер. Проще когда рендерер рисует примитивы, а каждый класс объекта имеет свою функцию рендер, которая рисует объект с помощью функций рендерера. Т.е. каждый объект рисует себя сам (так например в PainKiller сделано ).
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
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
kexman ну ты прям как Кармак, честное слово Ты на С пишешь или С++? Объекты сами по себе - это накладные расходы по памяти. Любое проектное решение связанное с применением ООП несет в себе лишние расходы, но:
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; }
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения