본문 바로가기

C..C++....

#define 문법.. while, Singleton

while 문을 사용하다보면 의도치 않게 기본적인 실수를 할때가 있습니다..

그러다 잘못하면 무한루프에 빠지게 되는데...



#ifdef _DEBUG
#define WHILE WHILE_DEBUG
#else
#define WHILE while
#endif // DEBUG

#define WHILE_DEBUG(type)         \
  int __nCount = 0;                 \
  while( type )                   \
  if(++__nCount > 100000)           \
  { printf("[FileName:%s][Func:%s][Line:%d]",__FILE__,__FUNCTION__,__LINE__); break; }   \
  else                            \

void main()
{
  int nCnt = 0;
  WHILE(1)
  {
     ++nCnt;
  }
  printf("결과값 : %d\n",nCnt);
}


SingleTon 인터페이스를 만들고 상속받아 사용할경우. SingleTon의 전체 생성자는 private: 로 해야되는데 상속받아 사용하는경우 생성자를 private:로 설정할수가 없다... (생성을 ISingleTon에서 하기때문에 ;;) 그래서 원치않게 SingleTon을 new로 새로 할당하는 문제까지 생기기도 하는데... 아래처럼 사용하면 싱글톤을 쉽게 사용할수있다...


#define  Singleton( _T )\
  private:\
    _T();\
  virtual	~_T();\
  public:\
  static _T* Instance()\
  {\
  static _T selfInstance;\
  \
  return &selfInstance;\
  }


사용법


class CSingleTonTest
{
  Singleton(CSingleTonTest);
public: 
  int k;
};

void main()
{
  CSingleTonTest::Instance()->k; // 정상
  CSingleTonTest* pTest = new  CSingleTonTest(); // 에러..
}


Get Set쉽게 하기..(라인줄이기?)


#define GetSetter(Name,var,Type)\
  Type Get##Name() const { return var;}\
  void Set##Name(Type _param) { var = _param; }

class CTest
{
public:
  GetSetter(Count,nCnt,int);
private: 
  int nCnt;
};

void main()
{
  CTest test;
  test.SetCount(10);
  printf("%d\n",test.GetCount());
}