2010-11-05 11 views
5

Le mie scuse se questo è un dupe. Ho trovato un numero di post re. prevenire conversioni implicite, ma niente di nuovo. incoraggiando costruzioni implicite.Quali argomenti devo passare a una funzione per eseguire una costruzione implicita di un oggetto?

Se ho:

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

e la funzione libera:

Rect Scale(const Rect &); 

perché sarebbe

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

non fare una costruzione implicita di un const Rect& e invece generare questo errore di compilazione

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

Se lo stai forzando, non è implicito! – RQDQ

risposta

11

Perché la lingua non supporta questa funzione. Devi scrivere

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

... o sovraccarico. Scala per accettare 4 galleggianti. – visitor

7

"Conversioni" in C++ sono tra oggetti di un tipo e un altro tipo. Hai 4 oggetti (tutti di tipo float), quindi potresti avere 4 conversioni in altri 4 tipi. Non c'è modo di convertire (nel senso C++ della parola) 4 oggetti in un oggetto.

2

Penso che tu stia parlando di costruire implicitamente un oggetto. Per esempio,

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

void DoSomething(const IntWrapper&) { } 

int main() { 
    DoSomething(5); 
} 

Questo funziona perché il costruttore IntWrapper s' richiede un solo argomento. Nel tuo caso, Rect ha bisogno di 4 argomenti, quindi non c'è una costruzione implicita.

+0

Dai un'occhiata a questa domanda su 'explicit', che è il modo in cui proibisci questo comportamento: http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean –

3

Una conversione implicita tramite costruttore ha luogo se e solo se il costruttore impiega esattamente 1 argomento e non è dichiarato esplicito. In questo caso ci vogliono 4, quindi il risultato.

Problemi correlati