2010-11-05 12 views
5

Mis disculpas si esto es una tontería. Encontré una cantidad de publicaciones re. evitando conversiones implícitas, pero nada re. fomentando construcciones implícitas.¿Qué argumentos debo pasar a una función para realizar una construcción implícita de un objeto?

Si tengo:

class Rect 
{ 
public: 
    Rect(float x1, float y1, float x2, float y2){}; 
}; 

y la función libre:

Rect Scale(const Rect &); 

¿por qué

Rect s = Scale(137.0f, 68.0f, 235.0f, 156.0f); 

no hacer una construcción implícita de un const Rect& y en lugar de generar este error del compilador

'Scale' : function does not take 4 arguments 
+1

Si lo está forzando, ¡entonces no está implícito! – RQDQ

Respuesta

11

Porque el idioma no es compatible con esta característica. Debe escribir

Rect s = Scale(Rect(137.0f, 68.0f, 235.0f, 156.0f)); 
+3

... o sobrecarga Escala para aceptar 4 flotadores. – visitor

7

"Conversiones" en C++ se encuentran entre objetos de un tipo y otro tipo. Tiene 4 objetos (todos de tipo flotante), por lo que podría tener 4 conversiones a otros 4 tipos. No hay forma de convertir (en el sentido C++ de la palabra) 4 objetos a un objeto.

2

Creo que estás hablando de construir implícitamente un objeto. Por ejemplo,

class IntWrapper { 
    public: 
     IntWrapper(int x) { } 
}; 

void DoSomething(const IntWrapper&) { } 

int main() { 
    DoSomething(5); 
} 

Esto funciona porque el constructor IntWrapper 's sólo toma un argumento. En su caso, Rect necesita 4 argumentos, por lo que no hay una construcción implícita.

+0

Consulte esta pregunta en 'explicit', que es la forma en que prohíbe este comportamiento: http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean –

3

Una conversión implícita a través del constructor tiene lugar si y solo si el constructor toma exactamente 1 argumento y no se declara explícito. En este caso, toma 4, por lo tanto, el resultado.

Cuestiones relacionadas