Pointer und Adresse 0
-
HumeSikkins schrieb:
Komisch. Ich wusste das diese in Standard-C++ ungültige Definition natürlich wieder von irgendjemanden eingeworfen wird
und warum ist das ungültig? ist doch auch bloss 'ne 0
-
Gibt es denn überhaupt ne Möglichkeit die char* Variante aufzurufen mit nem Nullzeiger?
Mir fällt da gerade nur char* p( NULL ); func( p ); ein, oder den Programmierer verantwortlichen Programmierer auf Kaffeeentzug zu setzen
-
net schrieb:
HumeSikkins schrieb:
Komisch. Ich wusste das diese in Standard-C++ ungültige Definition natürlich wieder von irgendjemanden eingeworfen wird
und warum ist das ungültig? ist doch auch bloss 'ne 0
Nö. 0 ist eine Nullpointer-Konstante, die im entsprechenden Kontext implizit in einen Nullpointer passenden Typs konvertiert werden kann. (void*)0 hingegen hat bereits den Typ void* und kann damit z.B. nicht als Initialisierung für einen int* benutzt werden. In C++ gibt es keine implizite Konvertierung zwischen void* -> ptr*.
Gibt es denn überhaupt ne Möglichkeit die char* Variante aufzurufen mit nem Nullzeiger?
Klar:
func(static_cast<char*>(0));
-
Naja, so könnte man es machen:
func( (char*)0 );
Meiner Meinung nach sollte sauberer Code nach Möglichkeit ohne Makros auskommen, und wenn man sich überlegt, dass irgendwo im Code ein "#define NULL 0" steht, nur damit man "int *i = NULL" schreiben kann, dann finde ich das ein wenig über.
Wofür auch? "0" sagt ja schon alles aus.
Außerdem ist es imo wesentlich übersichtlicher und schöner, wenn ich z.B. bei einer größeren Funktion schreiben:
func(0, 0, 0, 0, "Test"); // als func(NULL, NULL, NULL, NULL, "Test");Aber das ist wohl auch nur Geschmackssache.

-
User-- schrieb:
Gibt es denn überhaupt ne Möglichkeit die char* Variante aufzurufen mit nem Nullzeiger?
Ja, indem du zB eine Nullzeiger Klasse verwendest.
mantiz schrieb:
Außerdem ist es imo wesentlich übersichtlicher und schöner, wenn ich z.B. bei einer größeren Funktion schreiben:
func(0, 0, 0, 0, "Test"); // als func(NULL, NULL, NULL, NULL, "Test");Aber das ist wohl auch nur Geschmackssache.

Deine erste Funktion sagt mir, ich hab 4 ints und 'nen String. Von Zeiger ist da nichts zu sehen, deshalb kann man auf den ersten Blick auch nicht auf Nullzeiger schliessen. Deshalb find ich sowas überhaupt nicht schön. Und übersichtlicher auch nicht.
-
Naja, genauso kann der letzte Parameter ein "char*" oder "const char*" oder so sein, das sehe ich so sowieso nicht. Aber wenn ich die Maus über die Funktion halte, dann wird mir der Prototyp angezeigt und ich weiß wofür die Parameter stehen.
Ich würde nicht versuchen vom Namen der Variablen/Konstanten etc. beim Funktionsaufruf auf den Prototypen zu schließen, das könnte u.U. ziemlich schief gehen, aber wie gesagt, ist wohl Geschmackssache.

-
Hallo,
eine Funktion die man mit vier Nullpointern aufrufen kann ist ein Beispiel für ein schlechtes Interface. Da hilft auch kein NULL drüber hinweg.
Allein schon, weil weder NULL noch 0 eine Bedeutung verraten. Wenn ich also schon so eine Funktion habe, bleibt aus Sicht der Lesbarkeit imo sowieso nicht viel außer:func(0, // no Foo... 0, // no Bar... 0, // neither a humpty... 0, // nor a dumpty "Test");Besser wäre es natürlich, wenn man ein hübscheres Interface baut. Z.B. mittels Überladung.
-
War ja auch nur ein Beispiel ... *grml*

Wieso werden meine Beispiele immer so runtergemacht.
*schnief* *von-der-brücke-spring*Aber hast natürlich Recht, wenn ich an meinen WinAPI-Wrapper denke, dann hab' ich da z.B. sowas:
class Window { public: Window(std::string Text = "") { this->Create(0, Text); } Window(std::string Text = "", int x, int y) { this->Create(0, Text, x, y); } ... protected: Create(Widget* Parent, std::string Text, int x = CW_USEDEFAULT, int y = CW_USEDEFAULT, int width = CW_USEDEFAULT, int height = CW_USEDEFAULT) { ... } ... };Tut nichts zur Sache, wollte nur klarstellen, dass ich Funktionen/Methoden ebenfalls vermeide, wo man u.U. 4 oder mehr Nullpointer übergeben muss, das ist irgendwie zu Microsoft-lastig.

-
Ich geb lieber 10Parameter an, als ne Struktur anzulegen, auszufüllen und ner Funktion zu übergeben nur damit man nen kurzen Funktionsaufruf hat.
-
Wenn man 10 Funktionsparameter in C++ hat, dann nehme ich an hat man bei der Objektorientierten Programmierung auf ganzer Linie versagt.