2010-11-05 6 views
5

Ich entschuldige mich, wenn dies ein Betrogener ist. Ich habe eine Reihe von Posts gefunden. Implizite Konvertierungen verhindern, aber nichts re. ermutigende implizite Konstruktionen.Welche Argumente muss ich an eine Funktion übergeben, um eine implizite Konstruktion eines Objekts auszuführen?

Wenn ich habe:

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

und die freie Funktion:

Rect Scale(const Rect &); 

warum

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

keine implizite Bau eines const Rect& tun und stattdessen diesen Compiler-Fehler erzeugen

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

Wenn Sie es erzwingen, dann ist es nicht implizit! – RQDQ

Antwort

11

Da die Sprache diese Funktion nicht unterstützt. Sie müssen schreiben

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

... oder Überlast Skala, um 4 Schwimmer zu akzeptieren. – visitor

7

"Conversions" in C++ sind zwischen Objekten eines Typs und eines anderen Typs. Sie haben 4 Objekte (alle vom Typ float), also könnten Sie 4 Konvertierungen zu 4 anderen Typen haben. Es gibt keine Möglichkeit, 4 Objekte in ein C++ - Objekt umzuwandeln.

2

Ich denke, Sie sprechen implizit über ein Objekt zu konstruieren. Zum Beispiel

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

void DoSomething(const IntWrapper&) { } 

int main() { 
    DoSomething(5); 
} 

Das funktioniert, weil IntWrapper ‚s Konstruktor nur ein Argument nimmt. In Ihrem Fall benötigt Rect 4 Argumente, also gibt es keine implizite Konstruktion.

+0

Sehen Sie sich diese Frage zu 'explicit' an, was das verbieten ist: http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean –

3

Eine implizite Konvertierung über Konstruktor findet statt wenn und nur wenn der Konstruktor genau 1 Argument nimmt und nicht explizit deklariert wird. In diesem Fall dauert es 4, also das Ergebnis.

Verwandte Themen