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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему не происходит чуда ? RTTI 
V
    Опции темы
SABROG
Дата 12.3.2008, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Есть куча разных классов. Есть указатели на каждый. Указатели должны пихаться в item'ы скажем listbox'a. Хочу воспользоваться чудом RTTI и идентифицировать класс

Код

    if (typeid(*(void *)метод_для_взятия_указателя_через_индекс(i)) == typeid(ClassA))
    {
        ...
    }
    else if (typeid(*(void *)метод_для_взятия_указателя_через_индекс(i)) == typeid(ClassB))
    {
        ...
    }


На этапе компиляции такая ошибка: error: `void*' is not a pointer-to-object type

Т.е. чуда не будет ?



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
bsa
Дата 12.3.2008, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



не приводи к void*. А приводи к указателю на базовый класс.
PM   Вверх
SABROG
Дата 12.3.2008, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(bsa @ 12.3.2008,  23:10)
не приводи к void*. А приводи к указателю на базовый класс.

А тогда какой смысл, если я буду знать базовый класс, то мне и typeid нафиг не нужен. Я думал компилятор каким-то макаром соотносит циферки из указателя к типу "где-то у себя". Хочу чуда, я ему пихаю любую ссылку или указатель, а он мне говорит че я ему посунул.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
bsa
Дата 12.3.2008, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



SABROG, сделай класс: 
Код
struct MyBaseForAll
{
    virtual ~MyBaseForAll(){}
};
И унаследуй все классы от него.
PM   Вверх
SABROG
Дата 12.3.2008, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(bsa @ 12.3.2008,  23:29)
SABROG, сделай класс: 
Код
struct MyBaseForAll
{
    virtual ~MyBaseForAll(){}
};
И унаследуй все классы от него.

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

Код

    struct MyBaseForAll
    {
        virtual ~MyBaseForAll(){}
    };
    struct A :public MyBaseForAll
    {
        int var1;
    };
    struct B :public MyBaseForAll
    {
        int var2;
    };
    B *pvar1 = new B;
    pvar1->var2 = 2;
    MyBaseForAll *var = pvar1;
    if (typeid(*var) == typeid(B))
    {
        B *v = var;
        log(QString("B: %1").arg(v->var2));
    }
    else if (typeid(*var) == typeid(A))
    {
        A *v = var;
        log(QString("A: %1").arg(v->var1));
    }


error: invalid conversion from `MyBaseForAll*' to `B*'


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
bsa
Дата 13.3.2008, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



dynamic_cast рулит.  smile 
PM   Вверх
korian
Дата 13.3.2008, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а так буит работать?
Код

 if (typeid((void *)метод_для_взятия_указателя_через_индекс(i)) == typeid(ClassA*))

в какой-то умной книге читал, что-то типа такого:
если вы решили, что вам нужно знать/получать тип объекта (это касается и того, если вы в самом объекте храните его тип), задумайтесь! и используйте виртуальные функции.

а чуда нету, потому что тип void использовать нельзя
*(void*) = void
я правда хз, будет ли typeid работать с указателями вообще, и с указателем void* вчастности

Это сообщение отредактировал(а) korian - 13.3.2008, 00:12
PM   Вверх
SABROG
Дата 13.3.2008, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



С dynamic_cast действительно проканало, теперь я нереально буду рулить с указателями на базе MyBaseForAll.  smile Чудо все-таки произошло!  smile 

Цитата(korian @  13.3.2008,  00:05 Найти цитируемый пост)
а чуда нету, потому что тип void использовать нельзя
*(void*) = void
я правда хз, будет ли typeid работать с указателями вообще, и с указателем void* вчастности


"Нафиг нужна музыкальная школа, когда есть пример Паганини Никколо" © Ленинград

Я теперь в MyBaseForAll могу запихнуть хоть void * членом класса.

Это сообщение отредактировал(а) SABROG - 13.3.2008, 00:17


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Hehe
Дата 18.3.2008, 04:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Используй CLR и будет тебе счастье =) Ну во всяком случае - гемора меньше. =)

Это сообщение отредактировал(а) Hehe - 18.3.2008, 04:53
PM MAIL   Вверх
Lazin
Дата 18.3.2008, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



так к слову...
Цитата(MSDN)

The typeid operator does a run-time check when applied to an l-value of a polymorphic class type

то-есть чтобы чудо произошло, нужно, что-бы у класса была хотя-бы одна виртуальная функция  smile 
PM MAIL Skype GTalk   Вверх
SABROG
Дата 18.3.2008, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Я отказался от rtti, если компилятор создает сам таблицы и шарит по ним, то какой в этом смысл, если я могу делать тоже самое и со своей оптимизацией и уже никто не сможет отключить rtti у компилятора и сделать тем самым нерабочую программу.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Lazin
Дата 18.3.2008, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



если у тебя в коде используется dynamic_cast, то ты уже полюбому от RTTI зависишь
PM MAIL Skype GTalk   Вверх
SABROG
Дата 18.3.2008, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

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



Цитата(Lazin @ 18.3.2008,  09:59)
если у тебя в коде используется dynamic_cast, то ты уже полюбому от RTTI зависишь

Нет, не используется. Я просто вернулся к тому с чего начал, пихаю в итемы листбокса пару QPair<int, rootClass>, где int это Enum определяющий тип параметра, а rootClass корень дерева. В итоге, по смыслу, получается нечто вроде этого:

Код

enum {par1, par2, par3};
QPair<int, rootClass *> data = метод_получения_пары_из_итема(index);
int type = data.first();
rootClass *root = data.second();
switch(type)
{
case par1:
root->par1;
break;
case par2:
root->par2;
}


Только мне кажется Qt зависит, т.к. я вижу ключ -rtti при компиляции.

Это сообщение отредактировал(а) SABROG - 18.3.2008, 11:39


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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