Kopierkonstruktor
-
Da der Thread-Titel "Kopierkonstruktor" lautet:
class Test { public: Test() {...} //<- Default-Konstruktor Test( const Test& test ) {...} //<- Kopierkonstruktor Test( const Test* test ) {...} //<- Anderer Konstruktor }; int main() { Test a; // <- Default-Konstruktor Test b( a ); // <- Kopier-Konstruktor Test c( &a ); // <- Anderer Konstruktor }
-
hier ein Beispiel
CTest Beispiel; CTest* pTest = &Beispiel;wenn in Beispiel NULL Zeiger ist, soll hier kein Fehler produziert werden. sondern mithilfe des Zeigers Beispiel ein leere String zuweisen.
-
CTest Beispiel; CTest* pTest = &Beispiel;Die Adresse von Beispiel soll NULL sein? Ich glaube nicht

und überhaupt macht das, was du dort machst, keinen Sinn...
beschreibe mal, wofür du denkst, diesen ctor zu brauchen...bb
-
in der Klasse ist eine Zeigervariable m_str (typ LPWSTR), diese kann eine NULL Zeiger sein,
und wenn ich diese NULL Zeiger mit kopierkonstruktor kopiere, und diese mit hilfe pTest mit cout ausgeben will, wird eine Fehler auftreten wegen NULL Zeiger, deshalb möchte ich wenn die m_str bei Source noch NULL ist, dann soll sie bei Kopieren eine leere string zugewiesen bekommen, damit eine fehlerlose ausgabe mit cout möglich wäre. wisst ihr jez wie ich damit meine? da ich eine operator! intergriert hab, dachte ich mit (!*rhs) kann ich prüfen ob m_str NULL ist oder nicht, leider funz moment nicht richtig.
-
Warum nimmst du nicht std::wstring, da hast das Problem (plus ner Menge weiterer) nicht?
-
Badestrand schrieb:
Warum nimmst du nicht std::wstring, da hast das Problem (plus ner Menge weiterer) nicht?
dass man das Rad nicht neuerfinden soll, scheint die meinsten klar zu sein, nur man soll wissen, wie das rad aufgebaut ist, dadurch lernt man auch.
-
Derzeit sieht's für mich eher ziemlich wurschtelig aus.
edit: Also im Klartext, willst du eine eigene Stringklasse entwickeln? Dann könnte man schon viel konkreter Vorschläge machen.
-
Wie wärs damit (in etwa-ungetestet)?
class Test { wchar_t *anchor; static wchar_t *empty; public: Test(const Test& rhs) : anchor(nullptr) { size_t length = irgend_ne_fkt_die_die_laenge_angibt(anchor) +1; anchor = new wchar_t[length]; std::copy(rhs.anchor, rhs.anchor+length, anchor); } const wchar_t* c_str() const { return (anchor ? anchor : empty); } }; wchar_t *Test::empty = L"";bb
PS: Kanns sein, dass die stdlib keine Funktion bereitstellt, die die Länge eines wstrings ausgibt? Oo
-
unskilled schrieb:
PS: Kanns sein, dass die stdlib keine Funktion bereitstellt, die die Länge eines wstrings ausgibt? Oo
Wie wärs mit
std::char_traits<wchar_t>::length?
Gruß
Don06
-
Don06 schrieb:
unskilled schrieb:
PS: Kanns sein, dass die stdlib keine Funktion bereitstellt, die die Länge eines wstrings ausgibt? Oo
Wie wärs mit
std::char_traits<wchar_t>::length?
Gruß
Don06Jopp, klingt gut - hab auch gerade noch 'wcslen' gefunden - allerdings scheint keine der beiden c++ - referenz - seiten, irgend etwas darüber zu kennen -.-
http://www.cplusplus.com/query/search.cgi?q=wcslen
http://www.cppreference.com/wiki/?do=search&id=wcslen
bb
-
ah, ich hab mittlerweile gemerkt, dass ich ein denkfehler hab.
class CTest { .... public: CTest() {} CTest(const CTest* pObj) { // aufruf 2. konstruktor } }; CTest obj; CTest* test = &obj;Wird bei 2. Fall also CTest* test = &obj; hier überhaupt den 2. konstruktor aufgerufen? wenn nicht, wie sieht denn der 2. konstruktor aufruf denn aus?
-
Also ich kann dir leider nicht ganz folgen...
CTest obj; CTest test = obj; const wchar_t *test2 = test.c_str(); std::wcout << test2;bb