#include <cassert>

template <typename T> class Singleton
{
	static T* ms_Singleton;

public:
	Singleton( void )
	{
		assert( !ms_Singleton );
		int offset = (int)(T*)1 - (int)(Singleton <T>*)(T*)1;
		ms_Singleton = (T*)((int)this + offset);
	}
	~Singleton( void )
	{
		assert( ms_Singleton);
		ms_Singleton = 0;
	}

	static T& GetSingleton( void )
	{
		assert( ms_Singleton );
		return ( *ms_Singleton );
	}
	static T* GetSingletonPtr( void )
	{
		return ( ms_Singleton);
	}
	
};

template <typename T> T* Singleton <T>::ms_Singleton = 0;

'Programming > C / C++' 카테고리의 다른 글

단일체 (Singleton) 코드  (2) 2008.07.05
const 키워드의 의미  (0) 2008.05.28
동적할당을 통한 행열의 곱셈, 역행열, 전치행열 구하기  (0) 2007.11.23
ASSERT, VERIFY, TRACE  (0) 2007.01.31
[C++] typedef  (0) 2006.11.02
posted by deviAk
const 키워드의 용도는 변수를 상수화 시키기 위해 사용 한다.

- const int n = 10;
n 은 변수이나 const 키워드를 붙여줌으로 상수화 되었다.
따라서 n에 다른 값을 대입하는 것은 허용되지 않는다.

- const int* n;
데이터 상수화.
n이라는 포인터가 가르키는 값을 상수화 시킨다.

- int* const n;
포인터 상수화.
n이 가르키는 포인터를 상수화 시킨다.

- const int* const n;
데이터와 포인터 상수화.

'Programming > C / C++' 카테고리의 다른 글

단일체 (Singleton) 코드  (2) 2008.07.05
const 키워드의 의미  (0) 2008.05.28
동적할당을 통한 행열의 곱셈, 역행열, 전치행열 구하기  (0) 2007.11.23
ASSERT, VERIFY, TRACE  (0) 2007.01.31
[C++] typedef  (0) 2006.11.02
posted by deviAk
C, C++, const

운화형의 세미나 과제로 동적할당을 통한 행렬의 곱셈, 역행렬, 전치행렬을 구하는 프로그램을 만들어 봤다. 전체적인 프로그램의 흐름은 다음과 같다.

사용자 삽입 이미지


CMatrixMgr::ModeSelect 를 통하여 행렬의 곱, 역행렬, 전치행렬 중 어떠한 작업을 할 것인지 입력을 받는다. 그리고 CMatrixMgr::Run을 호출하여 행렬의 크기를 설정하는 CMatrix::SetArray, 행렬의 값을 입력 받는 CMatrix::InputMatrix, 계산을 수행하는 CMatrix::Calculation, 결과를 출력하는 CMatrix::Result 를 차례로 호출한다.


사용자 삽입 이미지

CMatrix 클래스는 역행렬 관련 클래스인 CMatrixInverse, 행렬의 곱셈 관련 클래스인 CMatrixMultiply, 전치행렬 관련 클래스인 CMatrixTranspose 의 부모 클래스 이다.


사용자 삽입 이미지


매니저 클래스인 CMatirxMgr 은 CMatrixInverse, CMatrixMultiply, CMatrixTranspose 클래스와 CMatrix 형의 *pCMat을 가지고 있다.
 

'Programming > C / C++' 카테고리의 다른 글

단일체 (Singleton) 코드  (2) 2008.07.05
const 키워드의 의미  (0) 2008.05.28
동적할당을 통한 행열의 곱셈, 역행열, 전치행열 구하기  (0) 2007.11.23
ASSERT, VERIFY, TRACE  (0) 2007.01.31
[C++] typedef  (0) 2006.11.02
posted by deviAk

ASSERT, VERIFY, TRACE

Programming/C / C++ 2007.01.31 00:17

출처 : www.sprite3d.net


MFC가 아닌 응용프로그램에서 ASSERT(), VERIFY(), TRACE() 사용하기
by Gabriel Fleseriu

원문 : http://www.gamedev.net/reference/articles/article1846.asp
번역 : conaman(conaman@spirit3d.net)


C++ 로 게임 개발을 해 올 때 몇몇 사람들이 MFC를 사용하기로 결정을 했습니다 늘 저는 ASSERT(), VERIFY(), TRACE() 매크로들의 유익함을 발견합니다 그래서 저는 윈도우 플랫폼을 위한 어떤 프로젝트에서든지 작업할 수 있도록 제 자신의 버전을 만들기로 했습니다.

약간 생각하게 하는 것들:

  • ASSERT()는 값이 0이면 실행을 멈추도록 하기 위해 매개변수을 평가하기로 되어있습니다 릴리즈 모드에서는 assert가 아무것도 전개되지 않도록 해야만 합니다.
  • VERIFY()는 릴리즈 모드에서 매개변수를 전개하도록 되어 있는 것을 제외하고는 ASSERT() 와 아주 유사합니다.
  • ASSERT() 는 어떠한 함수호출도 포함되어 있지 않는 표현으로 사용되어야만 합니다. 함수호출을 포함하는 표현을 위해 VERIFY() 를 사용해야만 하고, 그렇게 해서 함수호출은 릴리즈 모드에서도 보전됩니다.
  • TRACE() 는 디버그 윈도우에 출력되는 것을 제외하고는 printf() 의 대응물입니다. 릴리즈 모드에서는 TRACE() 또한 아무것도 전개하면 안 됩니다.
  • 세개의 매크로들 중 어떤것도 릴리즈 모드에서 어떤 런타임 벌점을 의미하지 않습니다. 그 매크로들은 미리 정의된 _DEBUG 매크로를 사용해서 디버그 모드와 릴리즈 모드 사이를 구별합니다. 이것은 Microsoft Visual C++에 특정적입니다. 만약 다른 몇몇 다른 컴파일러를 사용하고 있다면 적절한 매크로를 사용해야만 할 것입니다.
  • 바퀴를 재발명하기 위해 어떤 이해도 없기 때문에 저는 MFC 코드로 슬쩍 엿봤고 유사하게 저의 매크로들을 만들었습니다. ASSERT() 와 VERIFY() 를 위해서 저는 멋진 "Debug assertion failed..." 대화상자들은 곁에 남겨두고 간단하게 아주 평범한 breakpoint 를 구현 했습니다.


    ASSERT(), VERIFY(), TRACE() 를 지원하는데 필요한 두 파일들이 있습니다. 그것은 debug.h 와 debug.cpp 입니다. 프로젝트의 몇몇 메인 헤더에 debug.h 를 추가해야만 합니다. 그것은 자신 안에 어떤 파일도 포함하지 않기 때문에 순환 포함(recurrent inclusion) 들에 더럽혀지지 않습니다. 또한 프로젝트의 소스파일들에 debug.cpp 를 더해야만 합니다.


    여기에, 그것들이 있습니다.

    // file debug.h
    #ifndef __DEBUG_H__
    #define __DEBUG_H__
    #ifdef _DEBUG
    void _trace(char *fmt, ...);
    #define ASSERT(x) {if(!(x)) _asm{int 0x03}}
    #define VERIFY(x) {if(!(x)) _asm{int 0x03}}
    #else
    #define ASSERT(x)
    #define VERIFY(x) x
    #endif
    #ifdef _DEBUG
    #define TRACE _trace
    #else
    inline void _trace(LPCTSTR fmt, ...) { }
    #define TRACE  1 ? (void)0 : _trace
    #endif
    #endif // __DEBUG_H__


    //file debug.cpp
    #ifdef _DEBUG
    #include <stdio.h>
    #include <stdarg.h>
    #include <windows.h>
    void _trace(char *fmt, ...)
    {
        char out[1024];
        va_list body;
        va_start(body, fmt);
        vsprintf(out, fmt, body);
        va_end(body);
        OutputDebugString(out);
    }
    #endif

    'Programming > C / C++' 카테고리의 다른 글

    단일체 (Singleton) 코드  (2) 2008.07.05
    const 키워드의 의미  (0) 2008.05.28
    동적할당을 통한 행열의 곱셈, 역행열, 전치행열 구하기  (0) 2007.11.23
    ASSERT, VERIFY, TRACE  (0) 2007.01.31
    [C++] typedef  (0) 2006.11.02
    posted by deviAk

    [C++] typedef

    Programming/C / C++ 2006.11.02 09:36

    typedef

    // *****************
    // typedef 예약어 사용 예
    #include <iostream>

    typedef unsigned short int USHORT;    // typedef로 정의된다.

    int main()
    {
        using std::cout;
        using std::endl;

        USHORT Width = 5;
        USHORT Length;
        Length = 10;
       
        USHORT Area = Width * Length;
       
        cout << "Width : " << Width << endl;
        cout << "Length : " << Length << endl;
        cout << "Area : " << Area << endl;
        return 0;
    }

    결과
    Width : 5
    Length : 10
    Area : 50

    'Programming > C / C++' 카테고리의 다른 글

    단일체 (Singleton) 코드  (2) 2008.07.05
    const 키워드의 의미  (0) 2008.05.28
    동적할당을 통한 행열의 곱셈, 역행열, 전치행열 구하기  (0) 2007.11.23
    ASSERT, VERIFY, TRACE  (0) 2007.01.31
    [C++] typedef  (0) 2006.11.02
    posted by deviAk