Archiv verlassen und diese Seite im Standarddesign anzeigen : Welche Methode wird da in C++ aufgerufen?
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.
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:
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.
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?
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!
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.