해당 포스트는 "열혈강의 영상처리 프로그래밍" 책의 내용을 요약한 것이다.



ex3) 필수 멤버 함수 구현하기

 

//기본 생성자
    CMyImage(void)
	: m_nChannels(0)
	, m_nHeight(0)
	, m_nWidth(0)
	, m_nWStep(0)
	, m_pImageData(NULL)
	{}

기본 생성자에 의해 생성된 객체는 아무 내용을 담지 않으므로 멤버 변수들이 사용되는 일이 없어 아무 값을 넣어도 되지만 생성된 영상이 유효한지 확인할 때, 이들 멤버 변수값이 0인이 아닌지 확인하면 편리하다. 또한, m_pImageData의 경우 소멸자 안 메모리 해제 과정에서 NULL인지 아닌지 확인해야 하기 때문에 NULL로 초기화 해야 한다.

 

 

    CMyImage(int nWidth, int nHeight, int nChannels = 1)
	: m_nChannels(nChannels)
	, m_nHeight(nHeight)
	, m_nWidth(nWidth)
	, m_nWStep(((nWidth*nChannels*sizeof(T)+3)&~3)/sizeof(T))
	{
		m_pImageData = new T[m_nHeight*m_nWStep];
	}

영상 처리 프로그램 내부에서 컬러 영상보다 회색조 영상을 사용하는 빈도가 높아 채널 변수에 기본 매개변수 값으로 1로 설정

 

 

//복사 생성자
    CMyImage(const CMyImage& myImage)
	{
		m_nChannels = myImage.m_nChannels;
		m_nHeight	= myImage.m_nHeight;
		m_nWidth	= myImage.m_nWidth;
		m_nWStep	= myImage.m_nWStep;
		m_pImageData = new T[m_nHeight*m_nWStep];
		memcpy(m_pImageData, myImage.m_pImageData, m_nHeight*m_nWStep*sizeof(T));
	}

//대입 연산자
	CMyImage& operator=(const CMyImage& myImage) 
	{
		if (this == &myImage)
			return *this;

		m_nChannels = myImage.m_nChannels;
		m_nHeight	= myImage.m_nHeight;
		m_nWidth	= myImage.m_nWidth;
		m_nWStep	= myImage.m_nWStep;

		if (m_pImageData) 
			delete [] m_pImageData;

		if (myImage.m_pImageData != NULL)
		{
			m_pImageData = new T[m_nHeight*m_nWStep];
			memcpy(m_pImageData, myImage.m_pImageData, m_nHeight*m_nWStep*sizeof(T));
		}
		return *this;
	}

//소멸자
	~CMyImage(void) 
	{
		if (m_pImageData)
		{
			delete[] m_pImageData;
		}
	}

포인터 값을 멤버 변수로 가지고 있어 깊은 복사를 해야 하므로 복사 생성자와 대입 연산자를 재정의 해야 한다.

+ Recent posts