CMap::Lookup 메서드 살펴보기CMap::Lookup 메서드 살펴보기

Posted at 2008. 11. 28. 00:05 | Posted in 프로그래밍 언어/C/C++/MFC
먼저 CMap 클래스의 형태는 다음과 같다
template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >class CMap
: public CObject

그리고 Lookup 메서드의 형태는 다음과 같다.
BOOL Lookup(
ARG_KEY key,
VALUE& rValue
) const;

Lookup 메서드는 CMap 변수가 key 값이 할당되어 있는지를 찾는 함수이다. 예를 들면

typedef struct Info{
Info(){ i=0; }

int i;
} Info;


CMap<
int, int, Info, Info> map;
map.InitHashTable(
257); // 왜 하필 257? msdn 예제에서 257 쓰길래;
Info info;

info.i =
10;
map[
0] = info;

이후 다음과 같이 Lookup을 사용한다.
Info tmp;
map.Lookup(0, tmp); // return true;
map.Lookup(1, tmp); // return false;

Lookup 함수가 true를 리턴했다면 tmp 변수는 map[0]에 저장된 변수와 같은 값을 갖게 된다.
cout << map[0].i << endl; // 10 출력
cout << tmp.i << endl; // 10 출력

여기서 중요한 점은 map.Lookup(0, tmp); 에서의 tmp 변수와
map[0]에 저장된 값은 같으나 다른 변수이다.
어떤 단어를 써야 할지 모르겠어서 '변수'라고 썼다. 설명이 허접하니 예제를 보자
map.Lookup(0, tmp);
tmp.i = 1;
cout << map[0].i << endl; // 여전히 10 출력

즉, Lookup의 두 번째 파라미터로 들어간 tmp 변수에는 map[0]과 같은 데이터가 들어가 있지만
메모리의 다른 위치에 존재한다는 것이다.


추가.
CMap에 포인터를 저장하는 방식이라면 다음과 같이 되겠다.
(조금은 억지로 만든 예제이기 때문에 실제로 이렇게 코딩하면 안 된다;;)
CMap<int, int, Info*, Info*> map;
map.InitHashTable(257);
Info info;
info.i = 10;
map[0] = &info;

Info* tmp;
map.Lookup(0, tmp);
tmp->i = 1;

cout << map[0]->i << endl; // 1 출력

포인터니까 당연히 1이 출력된다. 특이한 거 아니다.
추가. 부분의 예제는 아무 의미 없는 예제다;;
굳이 쓰자면;
class A
{
public:
~A()
{

POSITION pos = m_Map.GetStartPosition();
int key;
Info* value;
while( pos )
{
m_Map.GetNextAssoc(pos, key, value);
delete value;
}
m_Map.RemoveAll(); // 이렇게 removeall 만 한다고 되는게 아니다.
// Method() 에서 동적할당 한 형태이므로 다 남아있다.
// RemoveAll() 하기 전에 하나하나 다 delete 해야 한다.
}
void A()
{
 m_Map[0] = new Info;
m_Map[11] = new Info;
}
void Increase()
{
Info* tmp;
m_Map.Lookup(11, tmp);
tmp->i++;
}
private:
CMap<int, int, Info*, Info*> m_Map;
}

그지같은 예제다.
소멸자에 주석으로 달아놓은 문제는 C++에서 new 로 동적할당하고
포인터를 stl 저장소에 넣었을 때 주의점이다.

//