string in const char*
-
samstagmorgen schrieb:
Arcoth schrieb:
Aber ich kann string_as_char auch nicht als const char* deklarieren, weil ich die die Variabel dann bereits im Konstruktor von foo füllen müsste.
Falsch. Das
constbezieht sich auf den Pointee, nicht auf den Zeiger.Ah, ok. Verstehe!
Arcoth schrieb:
Was soll ich am besten tun?
Intern einen
std::stringhalten. Anders geht es nicht, weil du so oder so irgendwie den Speicher managen musst.Mmh..anscheinend funktioniert es doch anders. Da sich ja const eben auf den Pointee bezieht, kann ich doch
const char* bar = foo.c_str();schreiben.
ja kannst du auch:
#include <string> class Foo { char const* CString; public: void SetString(std::string Data) { CString = Data.c_str(); } }; int main() { Foo Bar; std::string MyStr = "Hello there!"; Bar.SetString(MyStr); }
-
asfdlol schrieb:
#include <string> class Foo { char const* CString; public: void SetString(std::string Data) { CString = Data.c_str(); } }; int main() { Foo Bar; std::string MyStr = "Hello there!"; Bar.SetString(MyStr); }Das ist ein Musterbeispiel dafür, dass man besser std::string als Member halten sollte. Dein Code hat nämlich einen ganz subtilen Bug.
-
subtilebug schrieb:
asfdlol schrieb:
#include <string> class Foo { char const* CString; public: void SetString(std::string Data) { CString = Data.c_str(); } }; int main() { Foo Bar; std::string MyStr = "Hello there!"; Bar.SetString(MyStr); }Das ist ein Musterbeispiel dafür, dass man besser std::string als Member halten sollte. Dein Code hat nämlich einen ganz subtilen Bug.
dass der cstring ungütlig wird? ja das ist mir natürlich klar. es ging mir nur darum zu beweisen, dass sich das const auf den pointee und nicht auf den pointer bezog.
-
Ich sehe den Bug nicht? Warum sollte CString ungültig werden?
-
samstagmorgen schrieb:
Ich sehe den Bug nicht? Warum sollte CString ungültig werden?
The pointer returned may be invalidated by further calls to other member functions that modify the object.
-
asfdlol schrieb:
The pointer returned may be invalidated by further calls to other member functions that modify the object.
Insbesondere, wenn wie hier der Destruktor gerufen wird...
-
Caligulaminus schrieb:
asfdlol schrieb:
The pointer returned may be invalidated by further calls to other member functions that modify the object.
Insbesondere, wenn wie hier der Destruktor gerufen wird...ups ja, du hast recht, das habe ich gar nicht erst gemerkt als ich das listing vom op übernommen hab. ich würde hier den string als const reference übergeben. als copy macht nur sinn, wenn du sowieso in der funktion intern ein temporary erstellen möchtest davon (kann angeblich besser optimiert werden wenn die kopie in der parameterliste statt findet).
-
asfdlol schrieb:
Caligulaminus schrieb:
asfdlol schrieb:
The pointer returned may be invalidated by further calls to other member functions that modify the object.
Insbesondere, wenn wie hier der Destruktor gerufen wird...ups ja, du hast recht, das habe ich gar nicht erst gemerkt als ich das listing vom op übernommen hab. ich würde hier den string als const reference übergeben. als copy macht nur sinn, wenn du sowieso in der funktion intern ein temporary erstellen möchtest davon (kann angeblich besser optimiert werden wenn die kopie in der parameterliste statt findet).
Wie würdest du dem Anwender erklären, wie er diese Funktion aufrufen soll? "du darfst einen string benutzen, aber du darfst danach keine andere Aktion mit dem string mehr machen, insbesondere muss er immer gültig bleiben"?
-
SeppJ schrieb:
asfdlol schrieb:
Caligulaminus schrieb:
asfdlol schrieb:
The pointer returned may be invalidated by further calls to other member functions that modify the object.
Insbesondere, wenn wie hier der Destruktor gerufen wird...ups ja, du hast recht, das habe ich gar nicht erst gemerkt als ich das listing vom op übernommen hab. ich würde hier den string als const reference übergeben. als copy macht nur sinn, wenn du sowieso in der funktion intern ein temporary erstellen möchtest davon (kann angeblich besser optimiert werden wenn die kopie in der parameterliste statt findet).
Wie würdest du dem Anwender erklären, wie er diese Funktion aufrufen soll? "du darfst einen string benutzen, aber du darfst danach keine andere Aktion mit dem string mehr machen, insbesondere muss er immer gültig bleiben"?
ich habe ja nie die variante befürwortet, dass er sich einen cstring speichern soll. ich hab ihm lediglich gezeigt, wie das gehen würde (damit das missverständnis mit const aus der welt geräumt ist) und auf Caligulaminus hin habe ich hinzugefügt, dass es nicht hübsch ist, den string als value zu übergeben. ich selbst würde natürlich auch einfach einen string in die klasse tun, denn meiner meinung nach sind cstrings zeiger und keine zeichenketten.
-
asfdlol schrieb:
ich habe ja nie die variante befürwortet, dass er sich einen cstring speichern soll. ich hab ihm lediglich gezeigt, wie das gehen würde (damit das missverständnis mit const aus der welt geräumt ist) und auf Caligulaminus hin habe ich hinzugefügt, dass es nicht hübsch ist, den string als value zu übergeben. ich selbst würde natürlich auch einfach einen string in die klasse tun, denn meiner meinung nach sind cstrings zeiger und keine zeichenketten.
Ist mir schon klar. Ich mein ja auch nur, dass selbst diese Variante zeigt, wieso man das nicht so machen sollte.