2013-04-21 2 views
5

In C# ist sicherlich möglich, da diese übersetzbar Beispiel kann zeigen:Kann ich eine Funktion/Methode haben, die ein Argument als Referenz und eine Überladung als Wert in C++ übergibt? diese

static void Teste(int x) { } 
static void Teste(ref int x) { } 
static void Teste() 
{ 
    int i = 0; 
    Teste(i); 
    Teste(ref i); 
} 


Aber kann es in C++ (/ CLI) mit einem Konstruktor getan werden? Siehe nachstehendes Beispiel:

class Foo 
{ 
    Foo(int bar) 
    { 
     // initializing "Foo" instance... 
    } 
    Foo(int &bar) 
    { 
     // initializing "Foo" instance... 
    } 

    //... 
} 

Obwohl diese Klasse mit diesen Konstrukteuren nicht kompilieren kann ich nicht sehen, wie zu wählen, wenn ich eine Anwendung sind das andere, das heißt, ist der Ruf Ambiguos, da kein Schlüsselwort I zu diesem Zweck als "ref" in C# kennen. Ich versuchte es in einem Konstruktor, wo der Name der gleiche wie die Klasse sein muss (natürlich kann ich einen unbrauchbaren Parameter hinzufügen, aber ich möchte wissen, ob ich nicht es tun kann).

BTW, ich googelte und bekam nur Dinge wie "Was ist der Unterschied zwischen Ref und Wert?" aber nichts, was diese Überlastung überdeckt. Und ich denke, dass als Workarounds kann ich Zeiger verwenden, dank der "nehmen Sie die Adresse" (&); oder haben, wie oben erwähnt, einen zusätzlichen nutzlosen Parameter. Aber was ich wissen will ist: Kann ich Überlastungen wie diese haben (durch ref/nach Wert)?

Vielen Dank im Voraus,

+0

Versuchen Sie, die Konstruktoren zu initialisieren, indem Sie einen Zeiger auf eins und einen Wert auf den anderen setzen und sehen, was Sie bekommen – smac89

+0

Dies kann ein Duplikat sein, aber zu meiner Verteidigung suche ich nicht sehr gut; Außerdem ist der Name der anderen Frage nicht sehr eingängig (obwohl der Name dieses noch weniger ist). Auch als Nebenbemerkung fragt der andere Typ ob es Sinn macht, ich frage ob es möglich ist. – JMCF125

Antwort

1

Sie etwas ähnliches in C++, indem eine explizite Umwandlung in der gewünschten Art erreichen kann.

struct Foo 
{ 
    Foo(int /*bar*/) {} 
    Foo(int &/*bar*/) {} 
}; 


int main() 
{ 
    int value = 5; 
    Foo foo(static_cast<const int&>(value)); 

    return 0; 
} 

Die gegossene zu const wird Überladungsauflösung führen den Konstruktor nehmen eine nicht konstante Referenz und setzen sich auf vorbei Wert zu ignorieren.

+0

Warum ** const ** 'int &'? Warum funktioniert nicht nur "int &"? – JMCF125

+1

@ JMCF125 Da die nicht-const ref noch an den Konstruktor nach Wert übergeben werden kann. –

+0

Das ist peinlich: es hat funktioniert, aber jetzt habe ich es wieder getestet und es ist nicht! Es scheint nun, es von Const Int & zu Const Int zu konvertieren ... – JMCF125

Verwandte Themen