![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Alexander06 |
|
||||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Здравствуйте,
Моя программа должна работать с различными устройствами. Работу с каждым девайсом я описываю в отдельном классе, например
Интерфейс Interface_SSD_Device объявлен как
для того, чтобы в классе, создающем и управляющем объектами устройств обращаться к ним следующим образом Создаем объект PXI_6602:
И затем обращаемся к методам init и start объекта PXI_6602 или любого другого устройства строкой
При этом происходит EAccessViolation. В противном случае мне надо анализировать, какое именно у меня устройство, и делать вызов соответствующего объекта, например
Так делать не хочется. Подскажите, где я ошибаюсь в использовании интерфейса? |
||||||||||
|
|||||||||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
А без __fastcall не пробовали?
Если критична скорость, то следует избегать полиморфизма в рантайме. Вместо этого можно попытаться исопользовать шаблоны.? Это сообщение отредактировал(а) Леопольд - 26.6.2009, 14:47 -------------------- вопросов больше чем ответов |
|||
|
||||
| Alexander06 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Леопольд, __fascall - наследие класса TThread (C Builder), этот метод у меня лишь переопределяется.
В общем-то глючит не на его вызове, а при вызове метода init(). Почему-то конструкция
компилиться, но вызывает ошибку при выполнении. Как будто я не могу обраться к методу объекта Interface_SSD_Device* task. Это странно, так как подобное использование приведено в Википедии Скорость тут не критична, вызов производится однократно. Я хочу, чтобы коду управления устройствами было все равно, что это за объект. Упростить его логику. |
|||
|
||||
| ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 1 Всего: 23 |
Здесь вроде ошибки нет. Скорее всего ошибка в коде функции init
|
|||
|
||||
| Alexander06 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Странно..Билдер даже на заходит в нее. Как если бы я попытался сделать ((PXI_6602*)some_ptr)->init() на неподходящем указателе.
Попробую написать небольшой тестовый пример в понедельник. Спасибо за внимание. |
|||
|
||||
| DrHex |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 2.5.2009 Репутация: нет Всего: нет |
Скорее всего дело в твоем приведение.....
Подсказки: Множественное наследования..... Приведение типов при множественом наследовании.. Указатель на виртуальную таблицу...... --------------------
google.com и это все. |
|||
|
||||
| Alexander06 |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Нашел в чем было дело - некоторые классы не реализовывали интерфейс.
На крики компилятора я делал так
в то время при верном объявлении PXI_6602 должно работать и так
Естественно, ничем хорошим это кончиться не могло Тема закрыта. |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |