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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Типы, Определение типа динамически 
:(
    Опции темы
XandoX
Дата 5.5.2006, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!
Есть такое наследование:
ObjectData<-ObjectVisualInterface(он абстрактный)
ObjectData - хранит некоторые данные
ObjectVisualInterface - абстрактный класс определяющий интерфейс визуализации объекта, 
от него уже наследуются клссы визуализации для конкретных API (MFC, OpenGL, Win32)
И хотелось бы создать класс Object который хранит указатель на ObjectVisualInterface.
Но проблема в том, что ObjectVisualInterface содержит только функции обязательные, но конкретные реализации могут иметь еще и другие функции для своих нужд (например Устоновки цвета и т.д.)
и что бы использовать эти функции можно перегрузить operator-> который возвращает укозатель на нужный класс реализации интерфейса. Вопрос собственно в том как определить тип конкретной реализации и привести к нему ObjectVisualInterface*, или может можно как-нибуть его сохранить что бы потом использовать его?
Конечно можно было бы использовать шаблоны, но интересно: возможно ли такое без них?

 
PM MAIL   Вверх
bsa
Дата 5.5.2006, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Ищи документацию для:
typeid
а лучше для dynamic_cast

например здесь: http://www.cplusplus.com 
PM   Вверх
XandoX
Дата 5.5.2006, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



typid возврашает type_info, ето нельзя использовать как тип, а к dynamic_cast нужен конкретный тип, 
про что я собственно и спрашиваю. Дело в том что тип может быть создон познее, и не хочется переписывать код. 
PM MAIL   Вверх
MAKCim
Дата 5.5.2006, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Вопрос собственно в том как определить тип конкретной реализации и привести к нему ObjectVisualInterface*

Это как раз легко если известны/ен производные/ый классы/с
точнее можно исп-ть typelists+dynamic_cast, как результат - индекс в списке типов нужного типа
вопрос в другом: в operator->() тип возвращаемого значения должен быть известен в compile-time, а здесь явно run-time 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
XandoX
Дата 5.5.2006, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

вопрос в другом: в operator->() тип возвращаемого значения должен быть известен в compile-time, а здесь явно run-time  


тоесть без шаблонов не как?
а где про typelists почитать можно? 
PM MAIL   Вверх
MAKCim
Дата 5.5.2006, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

тоесть без шаблонов не как?

здается мне что и с шаблонами никак  smile 
про typelist-ы Book 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
LuckLess
Дата 5.5.2006, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



может так?
стиль аля COM
Код

#include <iostream>


class IVisual
   {
   public:
      virtual void QuerryInterface(int, void** retVal)
         {
         *retVal = 0;
         }
   };

class IExtendedVisual1 : public IVisual
   {
   public:
      virtual void QuerryInterface(int typeId, void** retVal)
         {
         if (typeId == 1)
            {
            IExtendedVisual1* rt(reinterpret_cast<IExtendedVisual1*>(*retVal));
            rt = this;
            }
         else
            {
            *retVal = 0;
            }
         }
   };

class IExtendedVisual2 : public IVisual
   {
   public:
      virtual void QuerryInterface(int typeId, void** retVal)
         {
         if (typeId == 2)
            {
            IExtendedVisual2* rt(reinterpret_cast<IExtendedVisual2*>(*retVal));
            rt = this;
            }
         else
            {
            *retVal = 0;
            }
         }
   };

class IExtendedVisual3 : public IVisual{};//класс не дает ничего нового по сравнению с базовым интерфейсом
//поэтому QuerryInterface не реализуеться.


void main(void)
   {
   IVisual* Interf = new IExtendedVisual1;
   IExtendedVisual1* ivis1;
   Interf->QuerryInterface(1, (void**)&ivis1);
   IExtendedVisual2* ivis2;
   Interf->QuerryInterface(2, (void**)&ivis2);   
   IExtendedVisual3* ivis3;
   Interf->QuerryInterface(3, (void**)&ivis3);
   std::cout << ivis1 << " " << ivis2 << " " << ivis3;
   }
 
PM MAIL   Вверх
MAKCim
Дата 5.5.2006, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

может так?

ИМХО, немного не то что просил XandoX
вообще, как хочет сделать он по-моему нельзя 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
LuckLess
Дата 5.5.2006, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



чуть более корректный вариант.
Код

#include <iostream>


class IVisual
   {
   public:
      virtual void QuerryInterface(int, void** retVal)
         {
         *retVal = 0;
         }
   };

class IExtendedVisual1 : public IVisual
   {
   public:
      virtual void QuerryInterface(int typeId, void** retVal)
         {
         if (typeId == 1)
            {
            IExtendedVisual1** rt = reinterpret_cast<IExtendedVisual1**>(retVal);
            *rt = this;
            }
         else
            {
            *retVal = 0;
            }
         }
   };

class IExtendedVisual2 : public IVisual
   {
   public:
      virtual void QuerryInterface(int typeId, void** retVal)
         {
         if (typeId == 2)
            {
            IExtendedVisual2** rt = reinterpret_cast<IExtendedVisual2**>(retVal);
            *rt = this;
            }
         else
            {
            *retVal = 0;
            }
         }
   };

class IExtendedVisual3 : public IVisual{};/*класс не дает ничего нового по сравнению с базовым интерфейсом*/
/*поэтому QuerryInterface не реализуеться.*/


void main(void)
   {
   IVisual* Interf = new IExtendedVisual1;
   IExtendedVisual1* ivis1;
   Interf->QuerryInterface(1, (void**)&ivis1);
   IExtendedVisual2* ivis2;
   Interf->QuerryInterface(2, (void**)&ivis2);   
   IExtendedVisual3* ivis3;
   Interf->QuerryInterface(3, (void**)&ivis3);
   std::cout << ivis1 << " " << ivis2 << " " << ivis3 << "\n";

   IVisual* Interf2= new IExtendedVisual2;
   Interf2->QuerryInterface(1, (void**)&ivis1);
   Interf2->QuerryInterface(2, (void**)&ivis2);   
   Interf2->QuerryInterface(3, (void**)&ivis3);
   std::cout << ivis1 << " " << ivis2 << " " << ivis3 << "\n";

   IVisual* Interf3= new IExtendedVisual3;
   Interf3->QuerryInterface(1, (void**)&ivis1);
   Interf3->QuerryInterface(2, (void**)&ivis2);   
   Interf3->QuerryInterface(3, (void**)&ivis3);
   std::cout << ivis1 << " " << ivis2 << " " << ivis3 << "\n";

   }


Добавлено @ 22:14 
Цитата(MAKCim @  5.5.2006,  22:09 Найти цитируемый пост)
ИМХО, немного не то что просил XandoX
вообще, как хочет сделать он по-моему нельзя  

тогда я не понял чего хочет автор.
ну operator нужный добавить е проблема.
что не то то? )) 

Это сообщение отредактировал(а) LuckLess - 5.5.2006, 22:13
PM MAIL   Вверх
XandoX
Дата 6.5.2006, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

что не то то? ))

Дело в том, что я спрашивал про то можно ли как-нибуть динамически определить тип и использовать эти знание, что нибуть вроде typeid(я понимаю, что такого оператора нет), но только чтобы возвращал сам тип, а не информацию о нем.
Ты же предложил вариант, когда мне все ровно нужен указатель на реализацию интерфейса, с этим-то кокрас и проблема, так как я не знаю что там за реализация  smile 
Object строестя фабрикой для конкретной реализации, может можно в этот момент как-нибуть сохранить тип?
  

Это сообщение отредактировал(а) XandoX - 6.5.2006, 08:02
PM MAIL   Вверх
MAKCim
Дата 6.5.2006, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

что не то то? ))

судя по всему XandoX-у надо что-то типа
Код

class holder
{
private:
...
    abstract* ptr;
...
public:
    <тип указателя на на объект на который указывает ptr в действительности>* operator->() {return <что-то>;}
};

думаю в такой вариации это невозможно 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
XandoX
Дата 6.5.2006, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



MAKCim, ага именно, что-то типа.
Да я уже тоже до этого дошел, что не возможно. Спасибо за разэяснения 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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