2011-09-26 6 views
1

컴파일러는 수동으로 정의되지 않은 경우 기본 생성자, 복사 생성자, 할당 연산자 및 소멸자를 POD 구조로 정의합니다. 일반적으로 (또는 어쩌면 내가 항상 말해야한다) 비트 복사 작업입니다. 그래서 Win 클래스 BITMAP 클래스를 상속 받아 생성자에서 메모리 할당을 제공하고 소멸자를 해제하기로 결정했습니다. Composition '을 사용하지 않았습니다. 일부 WinAPI 함수와 함께 사용하고 싶습니다.POD 구조체에서 상속받은 클래스에서 복사 생성자 정의

class CPreviewFrame : public BITMAP 
{ 
public: 
    CPreviewFrame(); 
    CPreviewFrame(std::size_t width, std::size_t height, UCHAR bytesPerPixel = 3); 
    CPreviewFrame(const CPreviewFrame& frame); 

    ~CPreviewFrame(); 
    ..... 
}; 

그리고 복사 생성자가 같은 것을 정의 :

CPreviewFrame::CPreviewFrame(const CPreviewFrame& frame): 
    BITMAP(static_cast<BITMAP>(frame)), //question is here 
    m_bufferSize(frame.m_bufferSize) 
{ 
    bmBits = new uint8_t[ m_bufferSize ]; 
    memcpy(bmBits, frame.bmBits, m_bufferSize); 
} 

그래서 내 질문은 : 그것은 상속 구조 또는에서 컴파일러 정의 된 복사 생성자를 호출하는 적절한 방법인가 여기에 코드의 일부 조각 생성자 본문에서 모든 필드를 수동으로 복사해야합니까? POD 구조체가 컴파일러를 정의 함에도 불구하고 생성자를 가질 수 없기 때문에 두 변종이 다소 이상하게 보입니다. 정의로 존재하지 않는 POD 데이터 유형의 생성자를 어떻게 호출 할 수 있습니까?

P. 위에서 언급 한 코드는 VS2010에서 잘 컴파일됩니다.

P.P.S. 이 테마에 관한 관련 질문이 있습니다 (here).

답변

4

BITMAP(frame)은 컴파일러가 부모 유형을 알고 암시 적으로 인수를 변환 할 수 있기 때문에 캐스트가 필요없는 트릭을 수행합니다. 캐스트를 명시 적으로 사용하여 참조 유형으로 캐스팅하려는 경우 : BITMAP(static_cast<const BITMAP&>(frame)),

또한이 상속을 심각하게 고려하십시오. 언젠가 1 ~ 2 년 후 누군가가 CPreviewFrame 개체 중 하나를 BITMAP으로 삭제하려고합니다. 그들이 메모리가 누출되는 가장 좋은 경우, 최악의 경우 응용 프로그램이 올바르게 작동하지 않는 이유를 디버깅하는 데 며칠 또는 몇 주를 소비합니다. WinAPI 함수를 호출하는 적절한 인터페이스가있는 컴포지션은 구현하기가 일반적으로 복잡하지 않으며 더 정확하고 정확하게 여기에서 문제를 모델링합니다.

다른 방법으로는 composition을 사용하고 비트 맵 부분에 getter를 제공하면됩니다 (주석에 제안 된대로). 이렇게하면 클래스의 구현 세부 사항이 노출되지만 단기간에 Win API에 쉽게 코딩 할 수 있습니다.

+0

참조 유형으로의 명시 적 형 변환의 경우 임시 변수 생성을 피하기 위해 필요하다고 생각합니까? 그것은 유용한 말이며, 나는 그것을 명심해야한다. 삭제에 관해서는 확실히 문제를 일으킬 수 있고 나는 그것을 알아 차리지 못했다. 그러나 이러한 기능을 제공하고 WinAPI와의 호환성을 유지하는 더 좋은 방법은 무엇입니까? (기능에 관해서는 메모리에 의해서만 제한되지 않고, 미리보기 프레임과 같은 관점의 비트 맵에서 다른 확장 기능이있을 수 있습니다). 아마도 BITMAP 또는 변환 연산자에 대한 참조를 위해 getter를 제공할까요? –