如您所知,编译器为POD结构定义默认构造函数,复制构造函数,赋值运算符和析构函数(如果未手动定义)。通常(或者我应该总是说)这是一个复制操作。所以我决定从Win结构BITMAP继承我的类,以在构造函数中提供内存分配并在析构函数中释放。我没有使用合成'因为我想允许使用它与一些WinAPI函数。这是一段代码:
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.S。上面提到的代码在VS2010上编译得很好。
P.P.S。我here发布了与此主题相关的问题。
答案 0 :(得分:4)
BITMAP(frame)
将完成这个技巧而不需要强制转换,因为编译器将知道父类型并能够隐式转换参数。请注意,如果您想使用强制转换来明确显示您正在做的事情,请将其转换为引用类型:BITMAP( static_cast<const BITMAP&>(frame) ),
另外,请认真考虑这种继承。从现在起一两年的某个时间,有人会将您的CPreviewFrame
个对象之一删除为BITMAP
。最好的情况是他们泄漏内存,最糟糕的情况是你花几天或几周调试为什么应用程序无法正常工作。组合(具有可在场景后面调用WinAPI函数的适当接口)实现起来通常并不复杂,并且它将更准确和正确地模拟您的问题。
或者,您可以使用合成并仅为位图部分提供一个getter(如注释中所示)。这会暴露您的类的实现细节,但可能会使您在短期内更容易编写Win API代码。