귀찮아...(유용링크)

어디선가의 글...

케이피 2008. 5. 20. 01:16


class에서의 static 멤버변수는 각 object들에 대해 공통적이다.
원래 한 클래스에서 파생된 각각의 오브젝트들은 자신들만의 멤버변수를 갖는다.
ob1.m_nAge와 ob2.m_nAge 는 메모리주소부터가 다른 것이다.
하지만 static 멤버변수는 같은 메모리주소를 공유해서 사용하기 때문에
ob1에서 static멤버변수의 값을 변경한다면 ob2에서의 값도 변경되게 된다.
책 한권을 친구 둘이서 같이 쓴다고 생각하면 이해하기 쉽..지 않을까?;;
한명이 낙서하면 다른 한명도 낙서된 책을 봐야하는..;;;

static 멤버변수는 생성자함수에서 초기값을 줄 수가 없다.
static 멤버변수의 초기값을 주기 위해선 .cpp 파일 아무곳에나 초기값을 넣어주어야 한다.
double CAccount::m_dCurrentRate = 0.01;

- static 멤버함수에는 this가 없다.
=> 다른 멤버를 사용할 수 없다.
하지만, static 멤버는 사용가능
- 목적 : 호출속도의 증가
   자유로운 함수 호출


/// 질문
이런.. 이건 ㅜ.ㅜ 너무 많은 시련이 앞을 막네요 ㅜ.ㅜ
제가 간단한 클래스를 만들고 있는데요. 이런 구린 에러가 ㅡ.ㅡ

class A

{

  static void A();             <=  static 함수

  virtual void B();            <= virtual 함수
}


A()                                <=  static함수내에서요

{

  B();                             <= virtual 함수를 불으려고 하니 에러가 나네요 ㅜ.ㅜ
}


이걸 어떻게 해결이 가능한가요???

조금 부탁드리면, 왜 이러는지 좀 알려주시면 감사하겠습니다..


/// 답변

일반적으로 클래스 멤버 함수는 사용자에게 보이지 않는(정확하게 말하면 소스상에 표시가 되지 않는) 파라미터를 하나 더 가지고 있는데 해당 객체의 this 포인터가 그것입니다. 그리고 객체 내부에서 멤버 함수를 호출할 때는 사실 this 포인터를 통해 함수를 호출하게 됩니다.

즉, 위의 예에서

B();

이렇게 A::B() 함수를 호출하게 되면 사실은

this->B(this);

이렇게 호출한 것이 되는 것이지요...그런데 static 멤버 함수인 A()의 경우는 static의 특성상 이런 this 포인터를 파라미터로 넘겨주지 않습니다. 따라서 소스에서

A()

    {

    B();

    }

이렇게 하면 A()는 this포인터가 없으므로(다시 말하면 자신을 소유한 객체가 없으므로) B()함수를 호출할 때 this를 참조할 수 없어 에러가 발생하는 것입니다.

따라서 static 멤버 함수를 내부적으로 사용할 때는 보통 파라미터로 자신의 객체 포인터를 명시적으로 선언하게 됩니다. 위의 예에서는

static void A(A* This);

이렇게 선언하고

A(A* This)

    {

    This->B();

    }

이렇게 사용하면 됩니다. 물론 A()함수 호출시에는 해당 객체의 포인터를 파라미터로 넘겨줘야 합니다