Как стать автором
Обновить

Комментарии 15

Еще можно сказать что есть встроенные макросы, например при наследовании, в объявлении класса можно пользоваться макросом CREATE_FUNC(CMyClass); ну и так же есть группа CC_SAFE_RELEASE, CC_SAFE_DELETE и так далее
Да, Вы совершенно правы. В cocos2d-x много полезных макросов, описаны они в файле CCPlatformMacros.h. И в объявлении класса можно написать строчку CREATE_FUNC(CMyClass). Этот макрос раскроется в статическую функцию для создания объекта CMyClass. Да что там говорить, смотрите сами:
/**
 * define a create function for a specific type, such as CCLayer
 * @__TYPE__ class type to add create(), such as CCLayer
 */
#define CREATE_FUNC(__TYPE__) \
static __TYPE__* create() \
{ \
    __TYPE__ *pRet = new __TYPE__(); \
    if (pRet && pRet->init()) \
    { \
        pRet->autorelease(); \
        return pRet; \
    } \
    else \
    { \
        delete pRet; \
        pRet = NULL; \
        return NULL; \
    } \
}
Почему не используют что-нибудь наподобие boost::shared_ptr или intrusive_ptr?
или std::shared_ptr ведь уже вполне можно использовать c++11
Третья версия как раз переезжает на канонические умные указатели. Ну и вообще, они собираются сделать Кокос ближе к С++-разработчикам, отходя от наследия Objective-C.
Вторая версия Cocos2d-x это не с++. Это все тот же Objective-C, но заточенный под с++ компилятор. В контексте современного с++ движок вообще спроектирован неправильно. Такая реализация, в принципе, не может быть сколько-нибудь эффективной. Да и радовать не может, постоянно приходится пилить какие-то костыли для решения тривиальных задач. То, что есть сейчас — это тяжелое бремя совместимости с Cocos2d. Надеюсь в 3-й версии забьют на совместимость и сделают полноценный и правильный с++ движок. Но это уже будет не Cocos2d…
По той же причине по которой не используют в других универсальных библиотеках. Нужен всего лишь умный указатель и тащить за собой целый буст и заставлять пользователей его собирать это не вариант. С появлением его в стл упростит задачу, но это произойдет когда большинство компиляторов его предоставят.
НЛО прилетело и опубликовало эту надпись здесь
Насчёт bad_alloc я согласен, но стандартный оператор new должен вернуть NULL в случае неудачи. Ведь в нём используется malloc, который в случае неудачи возвращает NULL. Я всегда так думал. Про конструктор… а если я хочу создать объект не в пуле? Мне еще один конструктор писать?
Но суть не в этом. В cocos2d-x код не идеален и иногда приходится копаться в коде и исправлять баги. Но что в этой жизни совершенно?

new (std::nothrow) T
Возвращает nullptr в случае неудачи, обычный кидает std::bad_alloc, тут и спорить не о чем.
Нигде не сказано, что new обязательно использует malloc внутри.
Желающим могу дать ссылку на ISO C++.
НЛО прилетело и опубликовало эту надпись здесь
Спасибо за информацию, постараюсь на такие грабли не наступать. А можете привести пример, где надо менять сцены местами? Просто не приходилось, интересно узнать.
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории