나는 작은 시작 테스트 팩토리를 구현하려고 애 쓰고있다. 레지스트라와 테스터 클래스 구현은 프로그램 시작시 팩토리를 가지고 등록한다. (실제 구현에서 코드를 빼앗 았기 때문에 컴파일되지 않을 수도있다. TestFactory의 getInstance는 단순화하기 위해 해당 코드를 제거했습니다.).컴파일러에 의한 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 오브젝트를 생성하지 않는다는 점이다 (제 1이라고 함). 이 상황을 처리하는 더 좋은 방법이 있습니까?
왜 문제입니까? 어쨌든 파일을 정의하는 파일이로드 될 때까지는 등록을 사용할 수 없다는 것을 의미합니까? –
네, 맞습니다. –
프로그램 시작시 이러한 정적 변수를 초기화하고 싶습니다. 즉,이 테스트 개체를 공장에 등록하기 전에 해당 테스트 개체를 호출해야한다는 것을 의미합니다. –