c ++ - Zuweisen einer Zeichenfolge zu null
Lerne ich C++ auf meinem eigenen. Ich habe folgenden code, aber es gibt Fehler.
#include <iostream>
#include <string>
using namespace std;
int setvalue(const char * value)
{
string mValue;
if(value!=0)
{
mValue=value;
}
else
{
mValue=0;
}
}
int main ()
{
const char* value = 0;
setvalue(value);
cin.get();
return 0;
}
So wollen, um eine Funktion zu erstellen, welche akzeptiert char-Zeiger und ich möchte einen Zeiger übergeben. Die Funktion weist der Zeiger auf den member-Variablen. Ich bin vorbei ein null-Zeiger absichtlich. Folgendes ist der Fehler, die ich immer bin:
D:\CPP\TestCP.cpp In function `int setvalue(const char*)':
note C:\Dev-Cpp\include\c++\3.4.2\bits\basic_string.h:422 candidates are: std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]
note C:\Dev-Cpp\include\c++\3.4.2\bits\basic_string.h:422 std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const _CharT*) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]
note C:\Dev-Cpp\include\c++\3.4.2\bits\basic_string.h:422 std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(_CharT) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]
es ist im Grunde beschweren sich über Zeile: mValue=0;
Warum gibt es Klagen über diese Linie? Ich kann nicht eine null zuweisen einer Zeichenfolge?
Kommentar zu dem Problem
Was sind Sie versuchen zu erreichen, indem Sie es auf 0?
Der Zweck der Funktion ist es, den char* an die Funktion übergeben, und weisen Sie Sie, um es ein Mitglied string-variable. Also ich überprüfe zuerst, ob es null ist, wenn es null ist, dann statt der Dereferenzierung eines null-Zeiger ist, ich bin durch das zuweisen von null zu Zeichenkette. Also der Zweck ist, zu haben mValue und Wert zu enthalten ähnliche Werte. Danke.
Aber
mValue = Wert;
würde nur tun, mValue = 0;
wenn value
ist ein null-Zeiger, wenn mValue = 0;
gültig waren, so dass die zusätzliche Kontrolle ist nicht wirklich etwas tun. Es wäre genauso hinfällig. Vielleicht möchten Sie sich in
boost::optional
, wenn Sie sind auf der Unterscheidung zwischen einem leeren string und kein string. @Maria - Sie können nicht lernen, C++, indem Sie versuchen es selbst, Sie müssen ein gutes Buch. Auch gcc 3.4.2 ist nicht ein guter compiler nicht mehr, es ist sehr alt.
InformationsquelleAutor der Frage Maria | 2012-07-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht.
std::string
ist nicht ein Zeiger-Typ; es kann nicht gemacht werden, "null." Es können für die Abwesenheit eines Wertes, das ist, was ein null-Zeiger verwendet wird, zu stellen.Kann es gemacht werden leer, durch die Zuweisung einer leeren Zeichenkette (
s = ""
oders = std::string()
) oder durch Beseitigung (s.clear()
).InformationsquelleAutor der Antwort James McNellis
Nicht zuordnen können
NULL
oder0
einer C++ -std::string
Objekt, weil das Objekt nicht ein Zeiger. Dies ist ein wesentlicher Unterschied zu C-style-strings; ein C-Stil-string kann entwederNULL
oder eine gültige Zeichenfolge, in der Erwägung, dass C++std::string
s immer speichern Wert.Gibt es keine einfache Lösung. Wenn Sie möchten, reservieren Sie einen sentinel-Wert (also die leere Zeichenfolge) ist, dann könnte man etwas tun, wie
Alternativ können Sie speichern einen Zeiger auf einen string, so dass Sie können setzen Sie ihn auf null:
Hoffe, das hilft!
InformationsquelleAutor der Antwort templatetypedef
Wörtliche
0
ist der Typint
und können Sie nicht zuordnenint
zustd::string
. VerwendenmValue.clear()
oder weisen eine leere ZeichenfolgemValue=""
.InformationsquelleAutor der Antwort Juraj Blaho
Gibt es zwei Methoden, um zu prüfen, welche den gleichen Effekt erzielen, für die Handhabung von null-Zeigern auf C-style strings.
Ternären operator
oder die bescheidenen if-Anweisung
In beiden Fällen
value
ist nur zugeordnetmValue
wennvalue
ist nicht ein null-Zeiger. In allen anderen Fällen (d.h. wennvalue
ist null)mValue
enthält eine leere Zeichenfolge.Ternären operator-Methode kann nützlich sein, für eine alternative Standard-string-literal in der Abwesenheit von einem Wert von
value
:InformationsquelleAutor der Antwort David Cormack
Ich will nicht behaupten, dass es ein gute Idee (oder die Semantik der Verwendung von
nullptr
mit Dingen, die nicht Zeiger), aber es ist relativ einfach, eine Klasse zu erstellen die " null-Werte zulässt " - Semantik (siehe nullable_string).Jedoch, dies ist eine viel bessere Passform für C++17 std::optional:
std::optional
, wie im Beispiel gezeigt, wird die Wandelanleihe zubool
oder Sie können verwenden diehas_value()
Methode, mit Ausnahmen für schlechte Zugang, etc. Dies bietet Ihnen mit nullable-Semantik, die das zu sein scheint was Maria wurde zu erreichen versucht., Und wenn Sie nicht warten wollen, um für C++17-Kompatibilität, finden Sie diese Antwort zu Steigern.Optional.
InformationsquelleAutor der Antwort monkey0506
Den
else
Fall ist unncecessary, wenn Sie erstellen einestring
Objekt, es ist standardmäßig leer.InformationsquelleAutor der Antwort Naveen
Viele C-APIs verwenden, einen null-Zeiger, um anzuzeigen, "verwenden der Standard", z.B. mosquittopp. Hier ist das Muster, das ich verwende, basiert auf David Cormack's Antwort:
Es ist ein wenig umständlich, aber können einem damit alles als
std::string
bis der API-Aufruf selbst.InformationsquelleAutor der Antwort Robert Calhoun