Структура порта в класс

Я использую фреймворк Allegro 5. Когда мне нужно создать очередь событий, я должен вызвать al_create_event_queue и проверить наличие ошибок, а чтобы уничтожить ее, al_destroy_event_queue. Поскольку это тот же механизм, который я должен использовать для создания каждого объекта, это довольно скучно.

Мой вопрос: есть способ «перенести» структуру в класс, чтобы конструктор my_event_queue фактически вызывал «al_create_event_queue», а деструктор вызывал «al_destroy_event_queue»? Если нет, то как я могу отслеживать объект, созданный этими функциями, чтобы они автоматически удалялись при уничтожении моего основного класса обработчика «Игра»?


person Silver    schedule 27.06.2011    source источник


Ответы (2)


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

struct MyQueue {
  MyQueue() : queue(al_create_event_queue() { }
  ~MyQueue() { al_destroy_event_queue(queue); }

  ALLEGRO_EVENT_QUEUE* queue;

private:
  MyQueue(const MyQueue&);
  MyQueue& operator =(MyQueue);
};

Обратите внимание, что вы не можете сделать слишком много, чтобы обернуть эти типы... вы так часто передаете эти указатели в коде Allegro, что вам в основном приходится открывать миру лежащий в основе объект queue.

person Dennis Zickefoose    schedule 27.06.2011
comment
прототип ALLEGRO_EVENT_QUEUE* al_create_event_queue().. как сопоставить типы данных ALLEGRO_EVENT_QUEUE и MyQueue? Я имею в виду, что я хочу вызывать функции, которые требуют структуры ALLEGRO_EVENT_QUEUE, вместо этого передавая MyQueue... И что означают «&» в конце переменной и «оператор»? (Извините, я пришел из Python!) - person Silver; 28.06.2011
comment
@Silver: Если вы пришли из Python, это не то, что вам нужно делать. Вам нужно узнать, как работает C++; вы не можете сразу приступить к разработке игр на C++, не зная синтаксиса. - person Nicol Bolas; 28.06.2011
comment
@Silver: я обновил, чтобы исправить фактический интерфейс, но я склонен согласиться с Никол. Изучение C++ путем погружения не работает так же хорошо, как с некоторыми языками. А использование Allegro для этого еще хуже... это библиотека C, которая компилируется компилятором C++, и вы приобретете вредные привычки из кода, который с ней взаимодействует. - person Dennis Zickefoose; 28.06.2011
comment
@Dennis Zickefoose: Спасибо за помощь. Не могли бы вы предложить мне хорошую ссылку на C/C++ (как можно более полную)? - person Silver; 28.06.2011
comment
@Dennis Zickefoose: Еще раз спасибо - person Silver; 28.06.2011

Да. Вы делаете именно то, что сказали. Вы, кажется, поняли это для себя.

Однако вам нужно убедиться, что вы правильно обрабатываете копирование. Вы должны либо запретить копирование этого объекта (через что-то вроде boost::noncopyable), либо написать для него конструктор копирования и оператор присваивания копии. Теперь очереди событий Allegro нельзя копировать (для этого нет функции Allegro), поэтому вам, вероятно, следует просто запретить копирование.

Если у вас есть доступ к C++0x, вам подойдет конструктор move и оператор присваивания перемещения.

person Nicol Bolas    schedule 27.06.2011
comment
что вы имеете в виду под словом "копировать"? - person Silver; 28.06.2011