Das überladen von Funktionen — zwei Funktionen unterscheiden sich nur durch eine default-parameter
class A{
public:
void foo(int x)
{
cout << "foo with one\n";
}
void foo(int x, int y=10)
{
cout << "foo with two\n";
}
};
int main()
{
A a;
a.foo(1); //error?
}
So, warum kann ich nicht überlasten void foo(int)
mit einer Funktion mit einem default-parameter?
Die Funktion sollte aufgerufen werden, im Fall von foo(10)? Wenn Sie diese Frage beantworten, werden Sie sehen, Ihre Lösung ist redundant.
Warum wollen Sie das tun? Haben Sie wirklich zwei verschiedenen die Funktionen mit dem gleichen Namen, die aufgerufen werden kann mit den gleichen Argumenten und unterschiedliche Aufgaben? Wenn Sie zwei verschiedene Implementierungen in Erwägung ziehen, andere Namen, andere Entwickler werden froh sein, zu erkennen, die von Namen, was Sie tun...
naja, eigentlich keine. Aber das gerade in den Sinn gekommen, 🙂
Warum wollen Sie das tun? Haben Sie wirklich zwei verschiedenen die Funktionen mit dem gleichen Namen, die aufgerufen werden kann mit den gleichen Argumenten und unterschiedliche Aufgaben? Wenn Sie zwei verschiedene Implementierungen in Erwägung ziehen, andere Namen, andere Entwickler werden froh sein, zu erkennen, die von Namen, was Sie tun...
naja, eigentlich keine. Aber das gerade in den Sinn gekommen, 🙂
InformationsquelleAutor Alcott | 2012-03-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, Sie ist nicht überladen von Funktionen auf basis von Wert des Arguments übergeben wird, So dass eine überlastung auf der Grundlage der Wert des default-argument ist auch nicht erlaubt.
Können Sie nur überlast-Funktionen nur auf der Grundlage von:
const
undvolatile
.Natürlich, Ob die überlast vom compiler akzeptiert wird, hängt von der Tatsache:
, Wenn der compiler beheben Aufruf der Funktion eindeutig.
In Ihrem Fall, die der compiler nicht auflösen kann, die Mehrdeutigkeit, die für die ex: Der compiler nicht weiß, welche überladene Funktion zu nennen, wenn Sie einfach die Funktion aufgerufen:
Der compiler kann nicht die Entscheidung treffen, und daher der Fehler.
Nein, Sie können nicht, Wie wird sich der compiler entscheiden, welche Funktion aufgerufen wird? Es gibt keine Möglichkeit für den compiler, um festzustellen, dass, wenn der einzige Unterschied ist ein Standard-argument.
Es ist komisch, dass deine zweite Absatz widerspricht dem ersten, weil die Anzahl der Argumente unterscheidet.
Ja, funny okay.Sieht aus wie Sie haben eine Menge Spaß.
Nun ja, aber weil es ist Freitag, das ist immer eine gute Sache.
InformationsquelleAutor Alok Save
Nein, Sie können nicht, es wird eine Mehrdeutigkeit beim Aufruf der Funktion mit einem einzelnen parameter.
Und wenn Sie brauchen, um dies zu tun, es ist ein code smell.
InformationsquelleAutor Luchian Grigore
Warum nicht?
};
InformationsquelleAutor Todd Murray
Ich tun NICHT empfehlen, aber du KANN Definition solcher mehrdeutige-Methoden und deren Nutzung durch verschiedene Schnittstellen.
(Das folgende funktioniert zumindest mit gcc 4.8.0 mit -std=c++11.)
Betrachten zwei Schnittstellen:
IInterface1
hatfunky
Methode überladen zweimal für verschiedene Argumente, d.h. gleicher Methodenname, aber man nimmt einzelne int bei den anderen beiden int-Werten. Hinweis: in interface-Implementierungfunky
Methode müssen zwei Implementierungen (eine für ein argument und ein weiteres für zwei Argumente).IInterface2
verfügt über Einzelzimmerfunky
Methode, nimmt entweder einen oder zwei int-Werte, wenn Sie angerufen werden. Wenn nicht explizit, die zweite int voreingestellt ist. Hinweis: in interface-Implementierungfunky
Methode müssen nur eine Umsetzung (und es dauert immer zwei Argumente, die unabhängig davon, ob ein oder zwei waren während invocation).Klasse implementiert beide Schnittstellen:
Zur Veranschaulichung
Foo
fügt auch die Dritte überladene version vonfunky
Methode, die drei Argumente benötigt (einen obligatorischen und zwei Fakultative).Foo
können nun verwendet werden, wie unten dargestellt. InstanzFoo
,master
, können verwendet werden, entweder direkt, oder unterschiedliche clients erhalten Zugriff auf verschiedene Schnittstellen desmaster
Objekt.Dies ergibt die folgende Ausgabe:
Zusammenfassend Klasse kann scheinbar widersprüchliche überladenen Versionen einer Methode. Mehrdeutigkeit MUSS gelöst werden, wenn die Methode aufgerufen wird (sonst wird der code nicht kompilieren).
PS: Wieder, da der obige Ansatz bricht das KISS-Prinzip, ich weiß es nicht dulden.
InformationsquelleAutor Petr Vepřek
Denke ich, kann man nicht. Da die Funktion/operator überladen wird gelöst, indem die compiler zur compile-Zeit. So das überladen einer Funktion nur durch die Bereitstellung einer Standard-argument verursachen Mehrdeutigkeiten und compiler-Fehler.
InformationsquelleAutor Apoorva sahay
Denken - zur compile-Zeit der compiler muß entscheiden, was man zu wählen. Ich kann nicht, es sei denn, Sie liefern beide Parameter. Also der compiler hat keine andere Wahl, als zu werfen Ihre Hände und sagen, dass versuchen Sie es erneut mit code, der nicht erforderlich Mystic Meg.
InformationsquelleAutor Ed Heal