Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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 />
✐