Я пытаюсь реализовать небольшую фабрику испытаний с реализацией класса регистратора и тестера, которые регистрируются на фабрике при запуске программы (они взяли код из фактической реализации, поэтому могут не компилироваться, а также игнорировать проблемы потоков для getInstance в TestFactory, удалили этот код, чтобы упростить.).Lazy Static инициализация компилятором. в C++
class Base {
public:
virtual int test() = 0;
virtual int createTestMsg() = 0 ;
};
typedef Base* (*pfn)();
class TestFactory {
public:
Base *getTester(int type) {
auto iter = mTesterRegistry.find(type);
if (mTesterRegistry.end() != iter) {
return iter->second();
}
return NULL;
}
TestFactory * getInstance() {
static TestFactory* ptr = new TestFactory();
mInstance.reset(ptr);
return ptr;
}
private:
static std::map<int, pfn> mTesterRegistry;
static std::unique_ptr<TestFactory> mInstance;
};
class Registrar {
public:
Registrar(MessageTypes type, pfnGetTester creator) {
TestFactory::getInstance()->registerType(type, creator);
}
};
// this is the test class implementation
class ToTest : public Base {
private:
static Registrar & registerMe();
static Registrar & mRegistrar;
};
// test class cpp file.
Registrar &ToTest::mRegistrar = ToTest::registerMe();
Registrar & ToTest::registerMe() {
static Registrar registrar(int,
[]() -> Base * {return new ToTest();});
return registrar;
}
Проблема заключается в том, что в данном методе инициализации, компилятор не создает объект mRegistrar до времени загружается модуль компиляции в памяти (первый называется). Есть ли лучший способ справиться с этой ситуацией?
Почему это проблема? Я имею в виду, что вы не можете использовать регистрацию, пока файл, определяющий их, не будет загружен в любом случае, не так ли? –
Да, это правда. –
Я хочу инициализировать эти статические переменные при запуске программы, поэтому это означает, что я должен сделать вызов этим тестовым объектам, прежде чем они будут зарегистрированы на заводе, это неправильное решение. –