Среда, 21.11.2018, 16:50
Мир Irrlicht
Главная | Форум | Статьи | Файлы | Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Irrlicht » Обсуждение движка » Попытка наследовать абстрактный класс (непонятки с IEventReceiver)
Попытка наследовать абстрактный класс
mmmaaakДата: Вторник, 08.06.2010, 01:18 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 2
Репутация: 0
Статус: Offline
При создании проекта решил вынести обработчик событий в отдельный класс. Писал его по принципу урока Movement из стандартной документации к движку.
Тоесть наследуем от абстрактного класса IEventReceiver.
Правой кнопкой по солюшену->Add->New Item->C++ class
Создается два файла класса, заголовок и сам код.
Заголовок:
Code

#pragma once
#include <irrlicht.h>
using namespace irr;
using namespace core;
using namespace video;
using namespace io;
using namespace gui;
class EventListener : public IEventReceiver
{
public:
  EventListener(void);
  ~EventListener(void);
  virtual bool onEvent(const SEvent& event);
  virtual bool isKeyDown(EKEY_CODE keyCode);
private:
  bool KeyIsDown[KEY_KEY_CODES_COUNT];
};

Код:
Code

#include "EventListener.h"

EventListener::EventListener(void)
{
  for (u32 i=0; i<KEY_KEY_CODES_COUNT; ++i)
    KeyIsDown[i] = false;
}

EventListener::~EventListener(void)
{
}

bool EventListener::onEvent(const SEvent &event)
{
if (event.EventType == irr::EET_KEY_INPUT_EVENT)
    KeyIsDown[event.KeyInput.Key] = event.KeyInput.PressedDown;

   return false;
}

bool EventListener::isKeyDown(EKEY_CODE keyCode)
{
   return KeyIsDown[keyCode];
}

Но при попытке создать экземпляр класса
EventListener listener;
Компилятор выдаетт ошибку:
Error 2 error C2259: 'EventListener' : cannot instantiate abstract class c:\documents and settings\userxp\мои документы\visual studio 2008\projects\irrlichtproject\irrlichtproject\main.cpp 12
Че за фигня, если писать прям в файле с основной функцией программы то все пашет, неужели все придется писать в одном файле?
 
RAngerДата: Среда, 09.06.2010, 15:23 | Сообщение # 2
Рядовой
Группа: Пользователи
Сообщений: 13
Репутация: 0
Статус: Offline
))) Я бы на твоём месте сделал бы первую букву в названии функции onEvent большой. По сути onEvent и OnEvent - это разные функции, это же Cpp)))) smile
abstract class - это класс, содержащий в числе своих методов чисто виртуальные функции ( указатель на такую функцию обнулён ). Класс IEventReceiver - интерфейс лихта для обработки событий с единственной виртуальной функцией OnEvent, определённой в его хэдере как
Code
virtual bool OnEvent(const SEvent& event) = 0;

мы её просто обязаны перегрузить)))
Рекомендую скомпилять документацию лихта в .chm ( удобства ради)) ) и сверяться))

bool KeyIsDown[KEY_KEY_CODES_COUNT]; - эт ты хочешь сочетания клавиш хэндлить?

 
greenyaДата: Четверг, 10.06.2010, 13:50 | Сообщение # 3
Admin
Группа: Администраторы
Сообщений: 32
Репутация: 1
Статус: Offline
Привет mmmaaak!

Дейсвительно, как сказал RAnger, проблема в том что ты не наполнил соджержимым полностью виртуальный метод OnEvent().
Есть виртуальные методы, а есть полностью виртуальные (pure virtual, не уверен когда я говорю "полностью" это хороший перевод).
Ты можешь наследовать любой класс, добавлять методы (как ты сделал с onEvent() ... это твой метод, тоесть родной метод твоего класса EventListener, причем виртуальный ... но это компилятору будет интересно тогда, когда ты будешь наследовать этот класс другим). Не реализованый полностью виртуальный метод OnEvent() компилятор не считает ошибкой в определении твоего класса, так как твой класс можно успешно наследовать и реализовать его уже там... ты создал еще один абстрактный класс. Компилятор не против. Он начинает возражать когда ты пытаешся создать объект класса, в котором есть хоть чтото недореализовано (тоесть полностью виртуальное).

Как-то так smile

 
mmmaaakДата: Четверг, 10.06.2010, 13:54 | Сообщение # 4
Рядовой
Группа: Пользователи
Сообщений: 2
Репутация: 0
Статус: Offline
Спасибо за ответы, вроде понял
 
Форум » Irrlicht » Обсуждение движка » Попытка наследовать абстрактный класс (непонятки с IEventReceiver)
  • Страница 1 из 1
  • 1
Поиск:

Copyright MyCorp © 2018 Создать бесплатный сайт с uCoz