13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 371 — #409<br />

✐<br />

12.6. Conversión automática de tipos<br />

Stringc s1("hello"), s2("there");<br />

strcmp(s1, s2); // Standard C function<br />

strspn(s1, s2); // Any string function!<br />

} ///:~<br />

Ahora cualquier función que acepte un argum<strong>en</strong>to char* puede aceptar también<br />

un argum<strong>en</strong>to Stringc porque el compilador sabe cómo crear un char* a partir de<br />

Stringc.<br />

12.6.4. Las trampas de la conversión automática de tipos<br />

Dado que el compilador debe decidir cómo realizar una conversión de tipos, puede<br />

meterse <strong>en</strong> problemas si el programador no diseña las conversiones correctam<strong>en</strong>te.<br />

Una situación obvia y simple sucede cuando una clase X que puede convertirse a<br />

sí misma <strong>en</strong> una clase Y con un operator Y(). Si la clase Y ti<strong>en</strong>e un constructor que<br />

toma un argum<strong>en</strong>to simple de tipo X, esto repres<strong>en</strong>ta la conversión de tipos idéntica.<br />

El compilador ahora ti<strong>en</strong>e dos formas de ir de X a Y, así que se g<strong>en</strong>erará una error de<br />

ambigüedad:<br />

//: C12:TypeConversionAmbiguity.cpp<br />

class Orange; // Class declaration<br />

class Apple {<br />

public:<br />

operator Orange() const; // Convert Apple to Orange<br />

};<br />

class Orange {<br />

public:<br />

Orange(Apple); // Convert Apple to Orange<br />

};<br />

void f(Orange) {}<br />

int main() {<br />

Apple a;<br />

//! f(a); // Error: ambiguous conversion<br />

} ///:~<br />

La solución obvia a este problema es no hacerla. Simplem<strong>en</strong>te proporcione una<br />

ruta única para la conversión automática de un tipo a otro.<br />

Un problema más difícil de eliminar sucede cuando proporciona conversiones<br />

automáticas a más de un tipo. Esto se llama a veces acomodami<strong>en</strong>to (FIXME):<br />

//: C12:TypeConversionFanout.cpp<br />

class Orange {};<br />

class Pear {};<br />

class Apple {<br />

public:<br />

operator Orange() const;<br />

operator Pear() const;<br />

371<br />

✐<br />

✐<br />

✐<br />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!