Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция, возвращающая любой тип данных? а как? 
V
    Опции темы
maq
Дата 19.2.2006, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



У меня такая проблема:

Нужно создать функцию, которая в зависимости от обработки (в теле самой функции), будет возвращать различные типы данных, например:

Код

switch(Condition)
{
case 1:
      HBITMAP hBitmap;
      ....
      return hBitmap;
      break;
case 2:
      HICON hIcon;
      ....
      return hIcon;
      break;
}

Кто-нибудь может помочь?
PM MAIL   Вверх
Mayk
Дата 19.2.2006, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Хмм. При сильном желании HBITMAP и HICON можно откастить в HANDLE.
Только надо ли оно?

Ну еще можно использовать union'ы, или модный ныне boost::any


ps. не стоит писать break после return'а. такой break никогда ничего не прервёт.

Это сообщение отредактировал(а) Mayk - 19.2.2006, 19:22


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
kanSC
Дата 20.2.2006, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пусть функция возвращает void*. А после вызова приводи возвращаемое значение к нужному тебе типу.
PM MAIL   Вверх
DeadSoul
Дата 20.2.2006, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(kanSC @ 20.2.2006, 00:27 Найти цитируемый пост)
Пусть функция возвращает void*. А после вызова приводи возвращаемое значение к нужному тебе типу

Оторвать руки за такие советы. А как определить к какому типу приводить?

Можно использовать:
1. variant
2. boost::variant(с первым пунктом имеет мало общего)

А в принципе тут скорее всего ошибка проектирования. Исходную задачу обнародуй


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
chipset
Дата 20.2.2006, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Отставить отрывание рук smile

Цитата(Mayk @ 19.2.2006, 09:15 Найти цитируемый пост)
Хмм. При сильном желании HBITMAP и HICON можно  откастить в HANDLE.

Не нужно большого желания. HBITMAP и HICON это typedef'ы HANDLE.
Добавлено @ 01:40
Если-же нужна реализация фабрики обьектов для других типов то:
1. Создаем базовой обьект с виртуальной функцией.
2. В switch'e наполняем вирт. функцию содержимым.
3. Возвращаем полиформно измененный обьект.


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
maq
Дата 20.2.2006, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



DeadSoul, chipset, а если по-подробнее, пожалуйста.
И если можно с примером...

Пробовал с VARIANT:
Код

VARIANT AAA(void);

Код

VARIANT RSplash::AAA(void)
{
    int B = 1;
switch(B)
{
case 1:
      HBITMAP hBitmap;
      return hBitmap;
case 2:
      HICON hIcon;
      return hIcon;
}
    return VARIANT();
}


ошибка:
Error 1 error C2664: 'tagVARIANT::tagVARIANT(const tagVARIANT &)' : cannot convert parameter 1 from 'HBITMAP' to 'const tagVARIANT &' c:\.....\rsplash.cpp 251

Код

variant AA(void);


Код

variant RSplash::AA(void)
{
    return variant();
}


теперь уже уйма ошибок! (кажется ошибка синтаксиса)
PM MAIL   Вверх
Mayk
Дата 20.2.2006, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Цитата(maq @ 21.2.2006, 00:03 Найти цитируемый пост)
если по-подробнее, пожалуйста.


Код

HANDLE func(int Condition)
{
    switch(Condition)
    {
        case 1:
             HBITMAP hBitmap;
             ....
            return (HANDLE)hBitmap;
           break;
       case 2:
          HICON hIcon;
           ....
         return (HANDLE)hIcon;
      break;
}



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
DeadSoul
Дата 20.2.2006, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(maq @ 20.2.2006, 20:03 Найти цитируемый пост)
DeadSoul, chipset, а если по-подробнее, пожалуйста.

Фигню сморозил. Как-то забыл о том, что это все typedef-ы для void*

maq, я бы подумал над разнесением этой функции на несколько


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
chipset
Дата 20.2.2006, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Цитата(DeadSoul @ 20.2.2006, 13:32 Найти цитируемый пост)
maq, я бы подумал над разнесением этой функции на несколько

Зачем?


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
DeadSoul
Дата 21.2.2006, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



chipset, а как с ней извне работать? Ты не знаешь, что там HICON,HBITMAP(а Api разные)
А внутри функции все равно switch\что-то shitch-е подобное


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
bel_nikita
Дата 21.2.2006, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Ну вот, такое извращение:
Код

typedef struct __stRetValue{
  enum eType{ RET_UNKNOWN, RET_HBITMAP, RET_HICON };
  union{
    HBITMAP hBitmap;
    HICON hIcon;
  };
  eType Type;
} RETVALUE;

RETVALUE RSplash::AAA(void)
{
RETVALUE Ret;
    int B = 1;
switch(B)
{
case 1:
      HBITMAP hBitmap;
      Ret.Type = RETVALUE::RET_HBITMAP;
      Ret.hBitmap = hBitmap;
break;
case 2:
      HICON hIcon;
      Ret.Type = RETVALUE::RET_HICON;
      Ret.hIcon = hIcon;
break;
}
    return Ret;
}

...

RETVALUE Value = RSplash::AAA();
switch (Value.Type)
{
case RETVALUE::RET_HBITMAP:
      HBITMAP hBitmap = Value.hBitmap;
break;
case RETVALUE::RET_HICON:
      HICON hIcon = Ret.hIcon;
break;
};




--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
DeadSoul
Дата 21.2.2006, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



bel_nikita, RETVALUE -> std::pair<...> smile


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
maq
Дата 21.2.2006, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Задача такая вот:

Код

HANDLE LoadFromExtRes(CString strFileName, int intResId, int intResType);


Код

HANDLE RSplash::LoadFromExtRes(CString strFileName, int intResId, int intResType)
{
    HMODULE h_resDll = LoadLibraryEx(strFileName, NULL, LOAD_LIBRARY_AS_DATAFILE);
    if(h_resDll != NULL)
    {
        switch(intResType)
        {
        case DST_BITMAP:
            HBITMAP h_bitmap = LoadBitmap(h_resDll, MAKEINTRESOURCE(intResId));
                        //FreeLibrary(h_resDll);
            return h_bitmap;
        }
    }
}


Код

m_static_logo.SetBitmap(LoadFromExtRes(str_temp, 1, DST_BITMAP));


Error 1 error C2664: 'CStatic::SetBitmap' : cannot convert parameter 1 from 'HANDLE' to 'HBITMAP'
PM MAIL   Вверх
Earnest
Дата 21.2.2006, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Можно применить насилие (HBITMAP)LoadFromRes(...)
Однако с точки зрения объектного программирования, это не очень хорошо, лучше бы как-то так:
Код

class СResourceLoader
{
public:
   СResourseLoader(const CString& strFile)
  {
     m_hRes = LoadLibraryEx(strFile, NULL, LOAD_LIBRARY_AS_DATAFILE);
  }

   bool InitBitmap(CBitmap& bmp,UINT nResID) const
  {
    if (m_hRes==0) return false;

     HBITMAP hBitmap = LoadBitmap(m_hRes, MAKEINTRESOURCE(nResId));
     if (hBitmap)   { bmp.SetBitmap(hBitmap); return true; }
     else return false;
 }
private:
   HMODULE m_hRes; 
};

Использование:
Код

   CBitmap bmp;
   CResourseLoader(strName).InitBitmap(bmp,nBmpID);

Т.е. вместо одной утилитной функции используем один утилитный класс.
Добавлено @ 20:08
Да, забыла, в деструкторе библиотеку нужно выгрузить.


--------------------
...
PM   Вверх
maq
Дата 22.2.2006, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Earnest, мне нужна именно функция

Код

HANDLE LoadFromExtRes(CString strFileName, int intResId, int intResType);

которая в зависимости от задаваемого параметра intResType (DST_BITMAP или напр. DST_ICON и т.д) возвращала бы HBITMAP или HICON.

Вместо твоего варианта я бы лучше разделил функцию LoadFromExtRes на LoadBitmapFromExtRes и LoadIconFromExtRes, которые возвращали бы HBITMAP и HICON.
Мне нужно просто объединить эти функции.

Но вот как?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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