Pull to refresh

Comments 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…
По той же причине по которой не используют в других универсальных библиотеках. Нужен всего лишь умный указатель и тащить за собой целый буст и заставлять пользователей его собирать это не вариант. С появлением его в стл упростит задачу, но это произойдет когда большинство компиляторов его предоставят.
UFO just landed and posted this here
Насчёт bad_alloc я согласен, но стандартный оператор new должен вернуть NULL в случае неудачи. Ведь в нём используется malloc, который в случае неудачи возвращает NULL. Я всегда так думал. Про конструктор… а если я хочу создать объект не в пуле? Мне еще один конструктор писать?
Но суть не в этом. В cocos2d-x код не идеален и иногда приходится копаться в коде и исправлять баги. Но что в этой жизни совершенно?

new (std::nothrow) T
Возвращает nullptr в случае неудачи, обычный кидает std::bad_alloc, тут и спорить не о чем.
Нигде не сказано, что new обязательно использует malloc внутри.
Желающим могу дать ссылку на ISO C++.
UFO just landed and posted this here
Спасибо за информацию, постараюсь на такие грабли не наступать. А можете привести пример, где надо менять сцены местами? Просто не приходилось, интересно узнать.
UFO just landed and posted this here
Only those users with full accounts are able to leave comments. Log in, please.