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