PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Welche Methode wird da in C++ aufgerufen?



idefix
08-01-2006, 16:08
Hi,

ich habe eine Klasse:
bla::add(string, int);
bla::add(string, string);

Jetzt rufe ich die Methode add mit den Parametern ("Test", NULL) auf, welche Methode wird da aufgerufen oder welche Methode muss ich da noch anlegen, das eine aufgerufen wird?

Danke für Eure Antworten.

bischi
08-01-2006, 16:27
Ich würde behaupten, dass keine von beiden aufgerufen wird - da keine besser ist, als die andere. Beide haben einen übereinstimmenden Parameter und die Konvertierungen von NULL nach int oder nach String scheinen beide meiner Meinung nach möglich zu sein und vom Compiler her implementiert...

Kann mich aber natürlich auch täuschen...

Neue Methode, die dann aufgerufen wird? Geht so glaub ich nicht... Würde einfach das NULL durch etwas anderes ersetzen - also entweder 0 oder "NULL" und dann entsprechend in den Funktionen behandeln...

Oder halt eine Funktion mit nur einem Parameter...

MfG Bischi

PS: Wieso werd ich das Gefühl nicht los, dass dies irgend so eine Uni-Aufgabe ist... :rolleyes:

BeS
08-01-2006, 17:50
Hallo,
probiers doch einfach aus...

Also bei mir wird die string, int Funktion aufgerufen, wobei ich beim übersetzen die Wahrnung " warning: passing NULL to non-pointer argument 2 of 'void add(std::string, int)' bekomme.
Wenn ich das Programm dazu zwinge die string, string Funktion zu nehmen (string, int auskommentieren) wird das Programm ohne Fehler/Warnung übersetzt aber beim Ausführen passiert das:

terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct NULL not valid
Aborted

Das ist aber nur ein experimentelles Ergebnis, wenn du das "offizielle" Verhalten wissen willst, mußt du wohl einen Blick in die Sprachspezifikation von C++ werfen.

idefix
08-01-2006, 19:10
mein Aufruf sieht leider so aus:
add("bla", methode2(foo));

Wenn die Methode methode2 jetzt ein NULL zurückgibt, habe ich genau das Problem was ich jetzt habe.

Klar kann ich jetzt da wieder eine if Abfrage rumschreiben, aber ich fände es am saubersten, wenn das abhandeln von solchen Speziallfälle in die entsprechende Klasse rein kommt.

Ich habe geschaut, was für eine Methode aufgrufen wird und es ist keine.
Ich bekomme die Fehlermeldung wie BeS es geschrieben hat.

Weiss keiner, wie ich die Funktion definieren müsste, damit dieser Spezialfall abgefangen wird?

locus vivendi
08-01-2006, 20:08
mein Aufruf sieht leider so aus:
add("bla", methode2(foo));

Wenn die Methode methode2 jetzt ein NULL zurückgibt, habe ich genau das Problem was ich jetzt habe.

Klar kann ich jetzt da wieder eine if Abfrage rumschreiben, aber ich fände es am saubersten, wenn das abhandeln von solchen Speziallfälle in die entsprechende Klasse rein kommt.

Ich habe geschaut, was für eine Methode aufgrufen wird und es ist keine.
Ich bekomme die Fehlermeldung wie BeS es geschrieben hat.

Weiss keiner, wie ich die Funktion definieren müsste, damit dieser Spezialfall abgefangen wird?
Ich glaube du vermischst zwei verschiedene Konzepte, nämlich erstens Overload-Resolution und zweitens das Verhalten zur Laufzeit, wenn die durch Overload-Resolution ausgewählte Funktion ausgeführt werden soll.

Ich fürchte, du wirst nicht umhin kommen, den Spezialfall "0" gesondert zu behandeln. Der gewählte Konstruktor von std::string erwartet einen nicht-null Zeiger. Kannst du denn die Definition von methode2 ändern? Wenn ja kannst du vielleicht "" (Also einen Zeiger auf einen leeren C-String) zurückgeben, anstatt einem Nullzeiger.

BLUESCREEN3D
08-01-2006, 22:26
mein Aufruf sieht leider so aus:
add("bla", methode2(foo));

Wenn die Methode methode2 jetzt ein NULL zurückgibt, habe ich genau das Problem was ich jetzt habe.
Ich würde das auch so sehen wie locus vivendi: Lass methode2 keinen Zeiger sondern einen String zurückgeben - denn den erwartet add() ja eigentlich auch...

Alternativ könntest du die add()-Funktion so umändern, dass sie statt einem String einen Zeiger erwartet, aber das war wohl nicht Sinn der Sache, oder?

idefix
08-01-2006, 22:52
Wenn ja kannst du vielleicht "" (Also einen Zeiger auf einen leeren C-String) zurückgeben, anstatt einem Nullzeiger.
Jepp, damit klappt es, danke Euch allen für die prompte Hilfe!