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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ошибка при использовании интерфейса, ошибка при использовании интерфейса 
V
    Опции темы
Alexander06
Дата 26.6.2009, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте,

Моя программа должна работать с различными устройствами.

Работу с каждым девайсом я описываю в отдельном классе, например 
Код

class PXI_6602: private TThread, public Interface_SSD_Device{
private:
    ...
    void __fastcall Execute();
public:
    int  init();
    int  start();

    PXI_6602(....);
    __fastcall ~PXI_6602();
};


Интерфейс Interface_SSD_Device объявлен как

Код

class Interface_SSD_Device{
    public:
    virtual int  init ()=0;
    virtual int  start()=0;
};


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

Создаем объект PXI_6602:

Код

Interface_SSD_Device* task;

task = (Interface_SSD_Device*) new PXI_6602(...);


И затем обращаемся к методам init и start объекта PXI_6602 или любого другого устройства строкой

Код

task->init();
task->start();


При этом происходит EAccessViolation.

В противном случае мне надо анализировать, какое именно у меня устройство, и делать вызов соответствующего объекта, например
Код


void* task;
if(type== TASK_6602)      
      task =(void*) new PXI_6602(...);

// далее везде делать проверки и соответствующие приведения и вызовы

if(type== TASK_6602)
      ((PXI_6602*)task)->init();

Так делать не хочется.

Подскажите, где я ошибаюсь в использовании интерфейса?
PM MAIL   Вверх
Леопольд
Дата 26.6.2009, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А без __fastcall не пробовали?

Если критична скорость, то следует избегать полиморфизма в рантайме. Вместо этого можно попытаться исопользовать шаблоны.?

Это сообщение отредактировал(а) Леопольд - 26.6.2009, 14:47


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Alexander06
Дата 26.6.2009, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Леопольд, __fascall - наследие класса TThread (C Builder), этот метод у меня лишь переопределяется.

В общем-то глючит не на его вызове, а при вызове метода init().
Почему-то конструкция
Код

task->init();

компилиться, но вызывает ошибку при выполнении. Как будто я не могу обраться к методу объекта Interface_SSD_Device* task.
Это странно, так как подобное использование приведено в Википедии

Скорость тут не критична, вызов производится однократно. 

Я хочу, чтобы коду управления устройствами было все равно, что это за объект. Упростить его логику. 

PM MAIL   Вверх
ИванМ
Дата 26.6.2009, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Здесь вроде ошибки нет. Скорее всего ошибка в коде функции init
PM MAIL   Вверх
Alexander06
Дата 26.6.2009, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Странно..Билдер даже на заходит в нее. Как если бы я попытался сделать ((PXI_6602*)some_ptr)->init() на неподходящем указателе.

Попробую написать небольшой тестовый пример в понедельник.

Спасибо за внимание.
PM MAIL   Вверх
DrHex
Дата 29.6.2009, 00:08 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Скорее всего дело в твоем приведение.....

Подсказки:

Множественное наследования.....

Приведение типов при множественом наследовании..

Указатель на виртуальную таблицу......


--------------------
google.com и это все.
PM MAIL   Вверх
Alexander06
Дата 29.6.2009, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нашел в чем было дело - некоторые классы не реализовывали интерфейс.

На крики компилятора я делал так

Код

Interface_SSD_Device* task;
task = (Interface_SSD_Device*) new PXI_6602(...);


в то время при верном объявлении PXI_6602 должно работать и так

Код

Interface_SSD_Device* task;
task = new PXI_6602(...);


Естественно, ничем хорошим это кончиться не моглоsmile
Тема закрыта.
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.0863 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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