Пятница, 22 Ноября 2024, 20:25

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Вопрос по полиморфизму.
ТехникДата: Пятница, 15 Июля 2011, 20:38 | Сообщение # 1
Глава X-ray Games
Сейчас нет на сайте
При написании движка возникла такая проблема. Так как использую два API :Directx 9 и Directx 10, то приходится работать с различающейся архитектурой классов. Из-за этого возникают проблемы. есть класс
Code

class DefaultDriver
{
...
};

class D3D9Driver:public DefaultDriver
{
...
public:
IDirect3DDevice9* GetDevice(); //получить указатель на устройство
};

class D3D10Driver:public DefaultDriver
{
...
public:
ID3D10Device* GetDevice(); //получить указатель на устройство
};

Все функции работают через вызовы базового класса, но как реализовать метод GetDevice в базовом,чтобы подходил для обоих классов?
KamskiiДата: Пятница, 15 Июля 2011, 20:58 | Сообщение # 2
Game ≠ Toy
Сейчас нет на сайте
Техник, может объявить его в базовом как виртуальный и перегрузить в каждом из классов-наследников?
ТехникДата: Суббота, 16 Июля 2011, 11:36 | Сообщение # 3
Глава X-ray Games
Сейчас нет на сайте
В том то и дело как это сделать в производных классах у этой функции разные типы возвращаемого значения.
getNameДата: Суббота, 16 Июля 2011, 11:50 | Сообщение # 4
JAVA. Написано однажды, работает везде.
Сейчас нет на сайте
Var?



Пришельцы! 2012 (рассказ)
KornivalДата: Суббота, 16 Июля 2011, 12:00 | Сообщение # 5
The Witcher
Сейчас нет на сайте
Quote (getName)
Var?

И?
noTformaTДата: Суббота, 16 Июля 2011, 12:28 | Сообщение # 6
Ukrainian independent game developer
Сейчас нет на сайте
Kornival, по идеи getName имел в виду не определенный тип VAR. Но в с++ его нет, а в шарпе есть
Quote (Техник)
Так как использую два API :Directx 9 и Directx 10,

вот тут не понял, разве в Д10 нет того что есть в Д9?
Quote (Kamskii)
Все функции работают через вызовы базового класса, но как реализовать метод GetDevice в базовом,чтобы подходил для обоих классов?

делаем его виртуальным и перегружаем его в потомках. тоесть в базовом классе метод нечего не возвращает, а потомке "а" возвращает тип "аа", а в потомке "б" - тип "бб"


@noTformaT
KornivalДата: Суббота, 16 Июля 2011, 12:35 | Сообщение # 7
The Witcher
Сейчас нет на сайте
Quote (noTformaT)
делаем его виртуальным и перегружаем его в потомках. тоесть в базовом классе метод нечего не возвращает, а потомке "а" возвращает тип "аа", а в потомке "б" - тип "бб"

Не прокатит biggrin Хотя надо проверить.
noTformaTДата: Суббота, 16 Июля 2011, 12:40 | Сообщение # 8
Ukrainian independent game developer
Сейчас нет на сайте
есть еще метод, но возможно он не проканает, если с++ не поддерживает множественное наследие.
объявить класс "а", который наследует два класса, класс с Д9, и класс с Д10.


@noTformaT
KornivalДата: Суббота, 16 Июля 2011, 12:43 | Сообщение # 9
The Witcher
Сейчас нет на сайте
Для того чтобы определить какая именно функция вызывается компилятору не достаточно одого только типа возвращаемого значения. А вот если в перегружаемые функции передавать разные параметры, тогда пожалуйста.
ТС надо или передавать в эти функции какие-то параметры, или подумать над более удачной архитектурой движка.

Добавлено (16.07.2011, 12:43)
---------------------------------------------

Quote (noTformaT)
есть еще метод, но возможно он не проканает, если с++ не поддерживает множественное наследие. объявить класс "а", который наследует два класса, класс с Д9, и класс с Д10.

С++ поддерживает множественное наследование, но все-равно:
Quote (Kornival)
Для того чтобы определить какая именно функция вызывается компилятору не достаточно одого только типа возвращаемого значения. А вот если в перегружаемые функции передавать разные параметры, тогда пожалуйста.
zodiakДата: Суббота, 16 Июля 2011, 12:55 | Сообщение # 10
постоянный участник
Сейчас нет на сайте
Quote (Техник)
В том то и дело как это сделать в производных классах у этой функции разные типы возвращаемого значения.

Они то разные, но они указатели, а конвертация указателей плевое дело. Вот только позже тебе придется проверять какой дх активен и приводить к нужному.
Да и проще иметь не два разных класса для разных дх, а один, содержащий оба дх и подстраивающийся под ситуацию. Но это подстраивание под ситуацию будет стоить чуть, чуть производительности. Так что лучше сделать два набора абсолютно идентичных класов, являющихся унифицированной оберткой для разный дх апи, и использовать нужный набор.


Точка зору окремо взятого індивіда завжди суб'єктивна!

Взломщик
Battle City.Net
ТехникДата: Воскресенье, 17 Июля 2011, 15:25 | Сообщение # 11
Глава X-ray Games
Сейчас нет на сайте
Если сделать общий класс-обертку,то это дорогого стоить будет, так как в десятке многое отличается от работы в девятой версии.

Добавлено (17.07.2011, 15:25)
---------------------------------------------
Решил проблему, посмотрев как реализовали этот метод в других движках(Irrlicht,OGRE). Всем спасибо за помощь.

Сообщение отредактировал Техник - Суббота, 16 Июля 2011, 13:54
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг