Problem bei Funktion für Stringverarbeitung
-
Meinst du sowas?
struct foo{}; ... func(foo(a, b, c, d, e, f, g));?
-
Ja das meine ich, aber bei mir geht das so nicht weil da nur ein Kopierkonstruktor und ein leerer Konstruktor zur Auswahl stehen.
-
Dann schreibste halt einen benutzerdefinierten Konstruktor!
Oder du nutzt Aggregat-Initialisierung:func({a, b, c, d});
-
Ich will bei einem vector mit diesem struct die structs mit push_back einfügen.
So wie du das geschrieben hast geht es leider nicht. Da steht dann nur es wurde ein Ausdruck erwartet. Geht wohl nur mit einer eigenen Funktion die den vector pointer und die restlichen Daten nimmt.
-
Wutz schrieb:
Reg dich ab.
Set/GetWindowText ist eindeutig WinAPI, und die arbeiten ausschließlich mit char/TCHAR.Das ist kein Grund, mit
new[]/delete[]zu arbeiten. Kannst auch genauso gutvector<char> puffer(999); eine_C_Funktion(&puffer[0],999);schreiben. Dann kann es dir gar nicht passieren,
delete[]zu "vergessen". Auch wenn dudelete[]dort stehen hast, kann ja zwischendurch irgendwo eine Ausnahme fliegen und dann hättest du ein Speicherleck, weil die Ausführung gar nicht erst zumdelete[]kommt.Ab C++11 ist das auch bei std::string erlaubt, weil garantiert ist, dass die Elemente hintereinander im Speicher stehen. Allerdings muss man sich, wenn man das so in String schreiben lässt, selbst um die Nullterminierung kümmern. Die will man typischerweise nicht mit drin haben und auch den Rest dahinter nicht. Also:
string s (999); eine_C_Funktion(s.data(),999); // ab C++11 s.erase(find(s.begin(),s.end(),'\0'),s.end());(ungetestet)
Merken:
new[]unddelete[]brauchen wir so gut wie nie mehr.
-
Merken: new[] und delete[] brauchen wir so gut wie nie mehr.
so gut?

Ich meine, wir brauchen seit C++11/14* nicht malnewzu schreiben, vorausgesetzt wir arbeiten brav mit Smart-Pointern.Auch wenn du delete[] dort stehen hast, kann ja zwischendurch irgendwo eine Ausnahme fliegen und dann hättest du ein Speicherleck, weil die Ausführung gar nicht erst zum delete[] kommt.
Wieso erklärst du ihm das? Das weiß er (so hoffe ich) selbst.
HWND ist wahrscheinlich ein void*, diese ueberladung gibt es wahrscheinlich schon.
Beides richtig.
HWNDist einHANDLE, was wiederum einPVOIDist. Und der Ausgabeoperator fürvoid*ist schon überladen (inostreamselbst).Die will man typischerweise nicht mit drin haben und auch den Rest dahinter nicht.
Bei vielen solchen Funktionen ist von vornherein klar, dass '\0' das letzte Zeichen im String ist - daher reicht da meistens auch ein pop_back().
Und wieso benutzt du nicht diefind()-Funktion ausstd::string?make_unique
-
Sone schrieb:
HWND ist wahrscheinlich ein void*, diese ueberladung gibt es wahrscheinlich schon.
Beides richtig.
HWNDist einHANDLE, was wiederum einPVOIDist. Und der Ausgabeoperator fürvoid*ist schon überladen (inostreamselbst).Er redet nicht vom Ausgabeoperator, Sone.

-
Nathan schrieb:
Sone schrieb:
HWND ist wahrscheinlich ein void*, diese ueberladung gibt es wahrscheinlich schon.
Beides richtig.
HWNDist einHANDLE, was wiederum einPVOIDist. Und der Ausgabeoperator fürvoid*ist schon überladen (inostreamselbst).Er redet nicht vom Ausgabeoperator, Sone.

Ich weiß ja nicht, wie du das siehst, aber wenn ich lese
Knivil schrieb:
Außerdem würde ich gern den << Operator für HWND überladen, aber es geht nicht.
[...]
2.) HWND ist wahrscheinlich ein void*, diese ueberladung gibt es wahrscheinlich schon.Dann folgere ich daraus, dass er sich auf das Zitat bezieht...
Edit: Ah, er will gar nicht denoperator<<fürostreamüberladen... :kopf->tisch:
-
Sone schrieb:
Die will man typischerweise nicht mit drin haben und auch den Rest dahinter nicht.
Bei vielen solchen Funktionen ist von vornherein klar, dass '\0' das letzte Zeichen im String ist - daher reicht da meistens auch ein pop_back().
Wenn du vorher genug Platz schaffst, der dann aber nicht voll ausgenutzt wird und dir so eine C-Funktion auch nicht verrät, wie lang der String wirklich war, musst du '\0' erst mal suchen. Und genau das wollte ich erwähnt haben.
Sone schrieb:
Und wieso benutzt du nicht die
find()-Funktion ausstd::string?Ich bin faul. Da hätte ich erst nachgucken müssen, wie die Überladungen und Signaturen aussehen, ob da ein Iterator oder ein Index zurück kommt und sowas...
-
ob da ein Iterator oder ein Index zurück kommt
Ist relativ egal, weil du den Index dann auch auf
begin()addieren kannst. Und die Zehn Sekunden Google-Recherche sind nicht die Welt.
Wenn du vorher genug Platz schaffst, der dann aber nicht voll ausgenutzt wird und dir so eine C-Funktion auch nicht verrät, wie lang der String wirklich war, musst du '\0' erst mal suchen.
Ganz vergessen - natürlich ist so ein String nicht immer auch genau so lang...

Zum Glück geben viele solche Funktionen die Länge zurück, da reicht ein
resize.