c++ static 관련 ..

hongwoo의 이미지

다음과 같은 코드가 있습니다.
Manager객체는 Clerk객체를 가지고 있습니다. (composition)
Manager객체를 싱글턴으로 구현합니다. Manager::instance()
Clerk의 생성자에서 Manager::instance()를 사용합니다.

#include <stdio.h>
 
class Clerk	{
public:
	Clerk();
	int num;
};
 
class Manager {
public:
	Manager(int id=8989);
	static Manager* instance();
 
	int num;
	Clerk clerk;
}; 
 
Manager::Manager(int id)
{
	num = id;
}
 
Manager* Manager::instance()
{
	printf("instance\n");
	static Manager man;
	return &man;
}
 
Clerk::Clerk()
{
	num = Manager::instance()->num;
}
 
int main(int argc, char* argv[])
{
	Manager* pMan = Manager::instance();
	printf("Hello World!\n");
	return 0;
}

visual c++에서는 의도한대로 동작하는데..,
cygwin gcc에서 instance가 recursive하게 호출됩니다.
왜 이럴까요 ??

Manager의 생성이 완료된 다음에
다른 멤쏘드에서 num = Manager::instance()->num; 를 하면 되겠지만,
굳이 생성자에서 num = Manager::instance()->num; 를 하고 싶다면, 어떤 방법이 좋을까요 ???

익명사용자의 이미지

Manager 가 Clerk 를 가지고 있고, Clerk 는 생성자에서 Manager 가 이미 생성

되어 있다고 가정하고 있습니다. Manager 가 생성될 때 가지고 있는 모든 멤버

변수가 생성 된 후에 생성됩니다. Manager 가 생성되려면 Clerk 가 생성되어야

하는데, Clerk 는 Manager 가 생성되어있길 바랍니다.

논리적으로 보면 recursive 가 맞습니다.

Clerk 의 생성자에서 num 를 매개변수로 받는게 좋다고 생각됩니다.