//────────────────────────────────────
// DATE : 2009 03 10 화
// DESC : 지역객체 사용시 주의점
//────────────────────────────────────
struct GeomObject
{
GeomObject( char* p, char* n, int data = 0 ) : data_(0)
{
parent_ = p;
name_ = n;
data_ = data;
}
GeomObject(){}
std::string parent_;
std::string name_;
std::vector< GeomObject* > pChild_;
int data_;
};
struct GeomObjectManager
{
void Insert( GeomObject& AAA );
void Print();
std::map< std::string, GeomObject > mapGO;
};
void GeomObjectManager::Insert( GeomObject& AAA )
{
std::map< std::string, GeomObject >::iterator itr;
itr = mapGO.find( AAA.name_ );
if( itr == mapGO.end() ) // 없는 인덱스일때
{
mapGO[ AAA.name_ ] = AAA; // 인덱스 생성
}
else // 이미 있다면 자신의 이름과 부모이름만 등록
{
// 그런데 이름마저 등록되어 있다면! skip. 그렇지 않다면 실행
if( strcmp( mapGO[ AAA.name_ ].name_.c_str(), AAA.name_.c_str() ) != 0 )
{
mapGO[ AAA.name_ ].name_ = AAA.name_;
mapGO[ AAA.name_ ].parent_ = AAA.parent_;
}
}
// 부모의 차일드 포인터에 자신을 등록
mapGO[ AAA.parent_ ].pChild_.push_back( &AAA );
}
//────────────────────────────────────
// 문제의 코드
//────────────────────────────────────
manager.Insert ( GeomObject ( "EEE", "AAA" ) );
manager.Insert ( GeomObject ( "EEE", "BBB" ) );
manager.Insert ( GeomObject ( "EEE", "CCC" ) );
manager.Insert ( GeomObject ( "EEE", "DDD" ) );
manager.Insert ( GeomObject ( "root", "EEE" ) );
이 상황에서 Insert는 전혀 기대한 대로 동작을 하지 않는다. 임시객체는 자신의 라인을 벗어나면
사라지는데, Insert에서 그 포인터를 가지고 있게 되기 때문이다.
역시 기본이 중요하다.