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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> *void + enum не работает, Неудается передать enum как *void 
:(
    Опции темы
CosmoMan
Дата 7.11.2010, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Столкнулся с интересной проблемой.
Есть такой код:
Код

enum RedactorObjectType
{
    RO_TYPE_NONE = 0,
    RO_TYPE_UNKNOWN,
    RO_TYPE_SCENE,
    RO_TYPE_GAME_OBJECT,
    RO_TYPE_CAR,
    RO_TYPE_FOLDER, 
    RO_TYPE_IMAGE,
    RO_TYPE_MODEL,
    RO_TYPE_TEXT,
    RO_TYPE_INI,

    RO_TYPE_NUM
};

class IRedactorObject
{
public:
    IRedactorObject();
    ~IRedactorObject(){};

    RedactorObjectType  m_type;
    int m_ID;

    virtual void OnActivate(){};
    virtual void OnRun(){};        
    virtual void OnAdd(){};        
    virtual void OnDelete(){};
};

IRedactorObject::IRedactorObject()
{
    m_type = RO_TYPE_NONE;
    m_ID = 123;
}



Указатель на этот класс передается как *void в функцию библиотеки некого компонента (wxWidgets).
Затем при активации компонента я получаю указатель *void на мой класс. 
Код

void MainWindow::OnTreeResourcesItemActivated(wxTreeEvent& event)
{
    IRedactorObject* robj = NULL;
    robj = reinterpret_cast<IRedactorObject*>(event.GetClientObject());
    int h = robj->m_ID;
    if(robj) robj->OnActivate();
}


Проблема:
robj->m_type не равен RO_TYPE_NONE (0) и каждый раз равняется разному числу больше 10000000
Но robj->m_ID равно 123 и функция вызывается правильно.
Почему enum не работает через *void ?
PM MAIL   Вверх
mes
Дата 7.11.2010, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



такое ощущение, что Вы убрали часть важного .. хотя оставили кучу ненужного.. 
где показано как сохраняете в void*? какой именно класс сохраняете в воид* ? он имеет множественное наследование?
определены m_id и m_type действительно ли в одном классе ?

Это сообщение отредактировал(а) mes - 7.11.2010, 20:26


--------------------
PM MAIL WWW   Вверх
CosmoMan
Дата 7.11.2010, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да, прошу прощение. От этого класса наследуется потомок, который затем передается как *void. 
Код

#include "IRedactorObject.h"

class Folder: public IRedactorObject
{
public:
    Folder(void);
    ~Folder(void);

    virtual void OnActivate()
    {
    }
};


Передача по void*
Код

wxTreeItemId newrootitem = m_TreeResources->InsertItem(rootitem, 0, filename, ICON_FOLDER_ID, ICON_FOLDER_ID, (wxTreeItemData*)new Folder());


wxTreeItemData* - это потомок класса wxClientData, возвращаемого функцией event.GetClientObject().
Класс wxClientData играет роль указателя на void. 

Это сообщение отредактировал(а) CosmoMan - 7.11.2010, 20:37
PM MAIL   Вверх
mes
Дата 7.11.2010, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



class IRedactorObject не имеет базы ? на каком основании тогда делаете каст к wxTreeItemData* ?
они у Вас бинарно совместимы ?

Добавлено @ 21:21
Цитата(CosmoMan @  7.11.2010,  19:15 Найти цитируемый пост)
reinterpret_cast<IRedactorObject*>(

почему не static_cast ? а лучше dynamic_cast.. но только после устранения несовместимости типов.. 


Это сообщение отредактировал(а) mes - 7.11.2010, 21:23


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


любитель
****


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

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



Цитата(CosmoMan @  7.11.2010,  19:15 Найти цитируемый пост)

    RedactorObjectType  m_type;
    int m_ID;

хак:
Код

    void *  m_dummy; // must be first
    RedactorObjectType  m_type;
    int m_ID;



Это сообщение отредактировал(а) mes - 7.11.2010, 21:55


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


Шустрый
*


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

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



Цитата(mes @  7.11.2010,  21:18 Найти цитируемый пост)
class IRedactorObject не имеет базы ? на каком основании тогда делаете каст к wxTreeItemData* ?они у Вас бинарно совместимы ?


Честно, не знаю. Класс wxClientData не имеет полей вообще, только конструктор и виртуальный деструктор. Если от него наследовать IRedactorObject, то это ничего не дает. 
Я бы рад заюзать что то другое, но это пока единственный способ для меня без лишних телодвижений узнать, какой элемент дерева активировал пользователь. 

Цитата(mes)

почему не static_cast ? а лучше dynamic_cast.. но только после устранения несовместимости типов.. 

Если юзать статик или дунамик, вообще возвращает NULL((

Цитата(mes @  7.11.2010,  21:55 Найти цитируемый пост)
хак:
Код

void *  m_dummy; // must be first    
RedactorObjectType  m_type;    
int m_ID;



О_о, фигассе, работает!! Как будто там указатель смещенный был. ? Спасибо огромное!


Это сообщение отредактировал(а) CosmoMan - 8.11.2010, 01:38
PM MAIL   Вверх
mes
Дата 8.11.2010, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(CosmoMan @  8.11.2010,  00:35 Найти цитируемый пост)
Класс wxClientData 

a wxTreeItemData имеет..

Цитата(CosmoMan @  8.11.2010,  00:35 Найти цитируемый пост)
Как будто там указатель смещенный был. 

нет, это wxTreeCtrl затирает ваш енум, работая с Вашим классом как с wxTreeItemData.. 
на этом месте (где был енум) хранится wxTreeItemId..

Добавлено через 8 минут и 6 секунд
Цитата(CosmoMan @  8.11.2010,  00:35 Найти цитируемый пост)
Если юзать статик или дунамик, вообще возвращает NULL((


Цитата(mes @  7.11.2010,  20:18 Найти цитируемый пост)
после устранения несовместимости типов.. 

т.е. после привода к одной базе.. а именно  после наследования от TreeItemData.. 



Это сообщение отредактировал(а) mes - 8.11.2010, 09:42


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


Шустрый
*


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

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



Все, разобрался. Я не от того класса наследовал. Если наследовать от TreeItemData, то все ок. 
Спасибо за помощь. 
PM MAIL   Вверх
mes
Дата 9.11.2010, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(CosmoMan @  9.11.2010,  09:54 Найти цитируемый пост)
сли наследовать от TreeItemData, то все ок. 

 smile 


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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