CArray mit eigenem Datentyp (struct)
-
Hallo
Ich brauche in einem SDI in dem Document eine Membervariable, in der ich folgendes abspeichern kann:
Ich lese aus einer Datei Sachen und kriege zu einem String mehrere dazugehörige Strings. Also brauche ich einen CString und eine dazugehörige CStringList. Davon habe ich auch mehrere also habe ich mir folgendes gebastelt:struct Daten { CString m_String; CStringList m_StringList; }; CArray<Daten, Daten> m_Daten;
Wenn ich jetzt aber mit
Daten p_Daten; p_Daten.m_Link = "String"; p_Daten.m_Ordner.AddTail("String1"); p_Daten.m_Ordner.AddTail("String2"); m_Daten.Add(p_Daten);
versuche das CArray zu füllen kriege ich komische Meldungen wie
error C2664: 'Add' : Konvertierung des Parameters 1 von 'struct Daten' in 'struct Daten' nicht moeglich!
Habe ich am Prinzip was nicht verstanden oder was mache ich falsch?[ Dieser Beitrag wurde am 11.12.2002 um 22:53 Uhr von ElDiablo666 editiert. ]
-
Die Funktion
m_Daten.Add(p_Daten);
legt eine Kopie von p_Daten an, danach wird noch eine Kopie des Parameters erstellt, welcher dann in der Stringlist steht. Das ist sehr uneffizient.
Es kann auch nicht funktionieren, weil jedes Element der Struktur einen Kopie-Konstruktor bzw. einen überladenen '=' operator aufweisen muss, welcher innerhalb von CStringList vergeblich zu suchen ist.Besser und funktionierend ist folgender Code:
struct Daten { CString m_String; CStringList m_Ordner; }; CArray<Daten, Daten&> m_Daten; m_Daten.SetSize( 10); // Anzahl der Elemente Daten& p_Daten = m_Daten[0]; // Zugriff auf 0tes Element p_Daten.m_Link = "String"; p_Daten.m_Ordner.AddTail("String1"); p_Daten.m_Ordner.AddTail("String2");
-
Danke aber das mit dem SetSize ist schwierig, weil ich vorher nicht weiß, wieviele Einträge ich brauche! Kann ich den Befehl zum vergrössern einfach wieder anwenden?
-
Besser wäre es, den =-operator zu überladen:
Daten& operator=( const Daten& src) { m_String = src.m_String; for( POSITION pos=src.m_Ordner.GetHeadPosition(); pos; ) m_Ordner.AddTail( src.m_Ordner.GetNext( pos); return *this; }
-
Das klingt etwas schwieriger!
Habe deswegen vorerst das Array gross genug gemacht aber da werde ich noch beigehen, weil ich möchte, daß das Programm natürlich unabhängig von der Datenmenge die kommt funktioniert...
-
Was klingt schwieriger?
Da gebe ich doch nun schon die komplette Lösung vor ... Copy&Paste dürfte doch nun nicht mehr schwierig sein, oder doch?
-
Das stimmt schon aber ich habe an anderen Stellen auch gerade das Problem, daß ich Werte fest habe und dafür muss ich mir erst eine Lösung überlegen...
Trotzdem schon ein grosses Danke!