Решил сделать базовый класс для всех игровых классов интерфейсом вида:
class IEntity { protected: virtual ~IEntity(void) { } virtual void destroy( void) = 0; public: virtual bool valid( void) const = 0; virtual unsigned int referenceCount( void) const = 0; virtual unsigned int retain( void) = 0; virtual unsigned int release( void) = 0; virtual int compare( const IEntity* other) const = 0; template<typename T> static void bind( T& dst, IEntity* src) { if ( src != NULL) { src->retain( ); } if ( dst != NULL) { dst->release( ); } dst = ( T)src; } };
Как можно заметить данный класс немного схож с IUnknown (в плане подсчета ссылок).
Также он содержит методы:
1) valid - предназначен для проверки состояния объекта (например если у нас объект является текстурой, то данный метод вернет true только если текстура создана, имеет корректный формат и размеры).
2) compare - позволяет сравнивать два объекта по некоторым аттрибутам, возвращает -1 если this < other, 1 если this > other и 0 если они равны.
3) bind - удобный метод для безопасного создания ссылки на объект (правда название bind не очень нравится).
Думаю у многих тут (которые пишут свои игры) есть нечто подобное, предлагаю показать и обсудить свои творения )
nes
ты уверен что этот класс вообще нужен?
struct IBase { };
=)
Pushkoff
Конечно, он удобен, ну по крайней мере в плане подсчета ссылок на объект, я это понял после того как увидел что такое Obj-C, это действительно удобно, попробуй )
berserkovich
А что у него внутри, меня больше всего внутренности интересуют )
nes
> Конечно, он удобен, ну по крайней мере в плане подсчета ссылок на объект
зачем их считать? может лучше ты бы выбрал шарп или яву?
призываю иннуэндо!!
nes
> А что у него внутри, меня больше всего внутренности интересуют )
ничего. это весь класс =)
Pushkoff
>зачем их считать?
Чтобы лишний раз не думать о том, что на объект еще будут ссылаться другие объекты после его удаления.
>может лучше ты бы выбрал шарп или яву?
Может, с явой не знаком, с шарпом три года назад работал, совсем немного и уже не помню его совсем.
В этих языках есть что-то удобнее рефкаунтера?
nes
> В этих языках есть что-то удобнее рефкаунтера?
да, сборщик мусора
nes
> Чтобы лишний раз не думать о том, что на объект еще будут ссылаться другие
> объекты после его удаления.
если не хочется думать, может перестать быть программистом?
nes
и для этих целей есть shared_ptr которому не нужны базовые классы
Pushkoff
>да, сборщик мусора
Если объект был удален а другой объект после смерти первого пытается к нему обратиться, как тут поможет сборщик мусора?
>и для этих целей есть shared_ptr которому не нужны базовые классы
Стараюсь не злоупотреблять шаблонами, обычно использую только в методах и функциях, да и запись вида ITexture* texturePtr, как-то приятнее чем shared_ptr<Texture> texturePtr
Pushkoff
> зачем их считать?
точно, ничего считать не надо - всё уже подсчитано до нас
> призываю иннуэндо!!
я не поддаюсь на провокации :)
nes
> Покажите свой базовый класс
void
Drazd
что это?
Тема в архиве.