Quantcast
Channel: Raiks'es Blog
Viewing all articles
Browse latest Browse all 4

Bad formas de declarar la firma del constructor copia

0
0

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.


Viewing all articles
Browse latest Browse all 4

Latest Images

Trending Articles





Latest Images