C ++ - Zeichenfolge, die NULL sein kann

7

Ich bin es gewohnt, in meinen C ++ - Anwendungen so eine Zeichenfolge zu übergeben:

%Vor%

Jetzt habe ich einen Fall, in dem die Zeichenfolge NULL sein soll:

%Vor%

Ich könnte foo ändern in:

%Vor%

Aber um ein String-Literal zu übergeben oder ein char* auf diese Implementierung von foo zu kopieren, muss ich etwas schreiben:

%Vor%

Ich habe angefangen, darüber nachzudenken, von std::string zu erben und eine null -Eigenschaft hinzuzufügen, aber ich bin mir nicht sicher, ob das eine gute Idee ist. Vielleicht ist es besser, einfach eine const char* -Zeichenfolge für Parameter zu verwenden, die NULL sein können, aber was ist, wenn ich eine Kopie der Zeichenfolge (oder NULL) speichern möchte, ohne selbst den Speicher verwalten zu müssen? (Siehe Was sind einige der Nachteile zu verwenden C-Style Strings? usw.)

Irgendeine clevere Lösung?

    
activout.se 04.12.2008, 19:24
quelle

7 Antworten

20

Wenn Sie möchten, dass der Typ null ist, dann machen Sie einen Zeiger. Übergeben Sie String-Zeiger anstelle von Referenzen, da dies genau das ist, was Zeiger tun können, und Referenzen können nicht. Referenzen zeigen immer auf dasselbe gültige Objekt. Zeiger können auf null gesetzt werden oder auf ein anderes Objekt verweisen. Wenn Sie also die Dinge brauchen, die Zeiger tun können, verwenden Sie Zeiger.

Alternativ können Sie boost :: optional verwenden, was eine typsicherere Methode zur Angabe von "diese Variable enthält möglicherweise einen Wert" enthält.

Oder ändern Sie die Semantik natürlich so, dass Sie entweder leere Strings anstelle von null verwenden, einen separaten bool -Parameter übergeben, der angibt, ob der String verfügbar ist oder nicht, oder refactor, so dass Sie ihn nicht benötigen.

    
jalf 04.12.2008, 19:36
quelle
11

Funktion überladen zur Rettung ...

%Vor%

Dies akzeptiert sowohl c-artige char-Arrays als auch std :: strings und verursacht zusätzlichen Overhead auf dem Stack, wenn Sie ein String-Literal oder ein char-Array übergeben, aber Sie können Ihre Implementierung an einer Stelle halten und behalten Deine nette Syntax.

    
eplawless 04.12.2008 19:44
quelle
11

Persönlich würde ich die Semantik ändern, um leere std :: strings anstelle von NULL zu übergeben:

%Vor%     
Max Lybbert 04.12.2008 19:33
quelle
3

Oder mischen Sie ein bisschen zwei vorherige Antworten:

%Vor%

Gleiche Schnittstelle, keine Kopie auf dem Stapel. Sie könnten, wenn Sie möchten, auch fooImpl inline.

    
Matt McClellan 04.12.2008 20:11
quelle
2

Warum überlädst du die Funktion nicht und gibst der zweiten Überladung kein Argument? Dann können beide Überladungen intern eine Funktion aufrufen, die die Leselogik bereitstellt und die selbst einen Zeiger an std::string übergibt.

%Vor%     
Konrad Rudolph 04.12.2008 19:37
quelle
2

Erbt absolut nicht von std::string . Vererbung ist die engste Kopplung, die Sie in C ++ haben können, und Sie suchen nur nach NULL, die Sie einfach mit const char* , Überladungen oder einfach std::string * erhalten können, wenn Sie wirklich wollen.

    
Tom 05.12.2008 03:05
quelle
1

Was ist, wenn Sie nur Folgendes verwenden:

%Vor%

Ja, dies führt zu einer zusätzlichen Zuweisung und Kopie, und der Aufruf der Funktion ist etwas ausführlicher, weil Sie im üblichen Fall .c_str() verwenden müssen, aber es gibt Ihnen die gewünschte Semantik.

    
Greg Hewgill 04.12.2008 19:28
quelle

Tags und Links