Android NDK, CRTP и шаблон дизайна фабрики

Я пытаюсь принять Любопытно рекурсивный шаблон(CRTP) для реализации своего рода Factory в моем приложении.

Я начал разрабатывать свою версию CRTP после этот хороший пост. Через CRTP вы можете зарегистрировать новые реализации вашего фабричного продукта, просто объявив их как подклассы любопытного шаблона. Ниже я вставил краткий пример кода, который я использую, который действительно похож на пример в вопросе.

class abstractProduct {
...
};

template <uint8_t TYPE, typename DERIVED>
class crtp : public abstractProduct{
uint8_t mType;
protected:
crtp() : mType(CRTP_ID){}
public:
enum { _CRTP_ID = TYPE };
static const abstractProduct* get(){
static DERIVED* sInstance = new DERIVED();
return sInstance;
}
static const uint8_t CRTP_ID;
};

template <uint8_t TYPE, typename DERIVED>
const uint8_t crtp<TYPE, DERIVED>::CRTP_ID = Factory::reg(crtp<TYPE, DERIVED>::_CRTP_ID, &crtp<TYPE, DERIVED>::get);

typedef const abstractProduct* (*f_dispenser)(void);
class Factory {
static std::map<uint8_t, f_dispenser>* sDict;

public:
static uint8_t reg(uint8_t shID, f_dispenser dispenser);
static bool has(uint8_t shID);
static const abstractProduct* dispense(uint8_t shID);
};

class sub : public crtp<1, sub>{
friend class crtp<1, sub>;
protected:
sub();
public:
virtual ~sub();
};

Как видите, как только вы объявите класс subдолжен быть создан новый шаблон crtp с параметрами <1, sub>, Шаблон класса crtp объявляет статический const uint8_t CRTP_ID который также упоминается в конструкторе crtp. Переменная статическая константа создается с помощью:

template <uint8_t TYPE, typename DERIVED>
const uint8_t crtp<TYPE, DERIVED>::CRTP_ID = Factory::reg(crtp<TYPE, DERIVED>::_CRTP_ID, &crtp<TYPE, DERIVED>::get);

CRTP_ID должна быть гарантированно инициализирована перед выполнением первой основной инструкции. Во время инициализации CRTP_ID класс зарегистрирован на фабрике

В настоящее время я использую ndk r8d и sdk 21.0.1.

Теперь проблема. Если я компилирую свой проект с помощью компилятора gcc по умолчанию, все работает нормально, и подклассы crtp автоматически регистрируются, если я компилирую свой проект с помощью цепочки инструментов Android, подклассы никогда не регистрируются.

Что я делаю не так?

РЕДАКТИРОВАТЬ

Мой Android-приложение полностью реализовано на C ++ с использованием NativeActivity. Я определил объект состояния, который создает и обрабатывает контекст OpenGLEs. Когда Android уведомляет о том, что окно готово к показу, оно создает контекст GL и загружает сетку для рендеринга.

state.cpp
case APP_CMD_INIT_WINDOW:
LOGI("[state]The window is being shown, get it ready.");
sSurfManager->init(app->window, app->activity->assetManager);

surfacemanager.cpp
int SurfaceManager::init(ANativeWindow* win, AAssetManager* man){
....
this->mModel = GeometryManager::loadModel("cube.ply", man);
}

GeometryManager::loadModel загружает геометрию и материалы из файла. Для каждого материала, найденного в сетке, он создает новый объект MaterialData, используя эту функцию:

static MaterialData* create(aiMaterial* material);

Внутри функции MaterialData :: create фабрика запрашивает правильный шейдер для визуализации материала.

MaterialData* MaterialData::create(aiMaterial* material){
...
result->setShader(ShaderFactory::dispense(1));
}

я знаю это ShaderFactory::dispense(1) Это не правильный способ получить шейдер, но я использую его, чтобы проверить, создан ли шейдер на заводе.

Спасибо!

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]