C++ - idiom - Construct on First Use
정적 오브젝트는 주의하지 않으면 초기화 되기 전에 사용하는 실수를 할 수 있다. 아래는 그 예이다.
#include <iostream>
class StaticObject
{
public:
StaticObject()
{
std::cout << "StaticObject::StaticObject()" << std::endl;
}
void callMethod()
{
std::cout << "StaticObject::callMethod()" << std::endl;
}
};
class MyClass
{
static StaticObject object_;
public:
MyClass()
{
std::cout << "MyClass::MyClass()" << std::endl;
object_.callMethod();
}
};
MyClass my_class; // ! 초기화 되지 않은 object 에 접근
StaticObject MyClass::object_;
int main()
{
std::cout << "main" << std::endl;
}
이런 문제를 해결하기 위해 정적 오브젝트로의 접근을 함수로 통해서 하도록 한다.
#include <iostream>
class StaticObject
{
public:
StaticObject()
{
std::cout << "StaticObject::StaticObject()" << std::endl;
}
void callMethod()
{
std::cout << "StaticObject::callMethod()" << std::endl;
}
};
class MyClass
{
StaticObject& Object()
{
static StaticObject object_;
return object_;
}
public:
MyClass()
{
std::cout << "MyClass::MyClass()" << std::endl;
Object().callMethod();
}
};
MyClass my_class;
int main()
{
std::cout << "main" << std::endl;
}
이 글은 2020-06-02에 작성되었습니다.