Recientemente decid? emplear EasyBMP para mi proyecto personal. Ya que debe funcionar en Windows, MacOS, Android y iOS, Yo mal necesitaba multiplataforma algo. Declarado como tal y tambi?n ser ligero, EasyBMP parec?a un trato. Sin embargo, Me enfrent? a un problema cuando tuve la necesidad de devolver una instancia de la clase BMP. El c?digo fue como sigue:
BMP Player::GetCurrentFrame() { BMP frame; // Some processing here return Frame; }
La siguiente l?nea se rompe la compilaci?n bajo ciertas compiladores (v.g.. MingGW utiliza en devcpp)
BMP frame = player->GetCurrentFrame();
Mir? en las fuentes y descubri? que la firma de copia ctor es una especie de no-est?ndar de ah? el error del compilador. The library's author decided to go with non-compliant copy ctor somehow.
// Doesn't work - compiler fails to find the copy ctor BMP( BMP& Input ); // Should be: BMP(const BMP& Input );
He tratado de cambiar s?lo la firma, pero esto llev? a "xxx descartes calificador const" error, ya que los m?todos llamados de la instancia de origen ("Input") No se marcan como const. En este punto yo ten?a 2 opciones:
1) Hacer un truco sucio y crear una ctor copia del proxy que arroja lejos constness y llama al ctor copia original:
BMP::BMP(const BMP& Input) { BMP(const_cast&lEntrada&>(Input)); }
2) Ir m?s all? y a?adir const a todos los m?todos que tienen sem?ntica getter:
int TellBitDepth( void ) const; int TellWidth( void ) const; int TellHeight( void ) const; int TellNumberOfColors( void ) const; int TellVerticalDPI( void ) const; int TellHorizontalDPI( void ) const; RGBApixel* operator()(int i,int j) const; RGBApixel GetPixel( int i, int j ) const; RGBApixel GetColor( int ColorNumber ) const;
El primer enfoque funcion? bien, la segunda revel? que en TellHorizontalDPI() (Ahora const) ciertos miembros est?n mutados. Con el fin de manejar que, Yo les marca correspondiente:
mutable int XPelsPerMeter; mutable int YPelsPerMeter;
This finally solved copy ctor problem.
La moraleja de la historia: siempre crear firmas de la copia de ctor compatible con el est?ndar, aunque los no convencionales trabajan bajo su compilador particular,. This also applied to the assignment operator.