Я пишу фреймворк для медиаплеера для проекта, над которым я работаю.Это зависит от VLC.Заголовочный файл одного из моих классов выглядит так:
#import <vlc/vlc.h>
@interface MediaPlayerVLC : MediaPlayer
{
libvlc_media_player_t *player;
libvlc_media_t *media;
}
@end
Мне нужны переменные экземпляра в классе, и мне нужен #import <vlc/vlc.h>
, потому что они определены там.Но я не хочу, чтобы пользователям этой инфраструктуры приходилось импортировать все заголовки VLC только для этих двух типов.Я видел несколько решений этой проблемы около ...
- Форвардное объявление, такое как
@class
.К сожалению, эти типы являются typedef struct
типами, я не могу найти какой-либо способ объявить их вперед - объявить ивары как
void *
, а затем разыграть их, когда я захочу их использовать.Я хотел бы избежать этого, если это возможно, поскольку мы теряем безопасность типов и файлы реализации становятся полными уродливых приведений. Я видел это в каркасах Apple ...
@interface CAAnimation : NSObject <NSCoding, NSCopying, CAMediaTiming, CAAction>
{
@private
void *_attr;
uint32_t _flags;
}
На что указывает _attr
?Я предполагаю, что это будет структура ivars, мне любопытно, какие преимущества это имеет ...
- Два заголовочных файла для класса, один открытый и один закрытый.Приватный выглядел бы так, как указано выше, а у публики были бы
void *
указатели.Это довольно уродливо, так как я должен быть очень осторожным, чтобы синхронизировать их обоих.
Что считается наилучшей практикой?Есть ли подход, который я пропустил?