ERLEDIGT
NEIN
NEIN
ANTWORTEN
15
15
ZUGRIFFE
8735
8735
EMPFEHLEN
-
Hi
ich hab ein problem. Ich habe eine Klasse in dem Daten in einer Variable vom Typ
CList<CString,CString> speichere. Diese heist
Code :1
CList<CString,CString> list;
wie kann ich diese Variable einer Funktion überben wie muss der Funktionskopf deklariert sein. Bin momentan echt ratlos, denn ich hab schon vieles versucht.
kann ich dann überhaupt
Code :1
"return list;"
machen
Thx Indian
-
return list geht.
Beim Übergeben würde ich wenn möglich Referenzen benutzen:
Code :1 2 3 4 5 6 7 8 9
void FunktionTuWas( const CList<CString,CString>& liste ) { // dann einfach damit arbeiten liste.wullewatz(); } // Aufruf FunktionTuWas( list );
Wenn du die übergebene Liste ändern willst, entferne das const.
-
danke
1. aber wie initalsiert bzw. schreibt man denn Datentyp des Funktionkopfes ? so ?
CList<CString,CString> Funktion(int a)
2. wie kann ich eine CList<CString,CString> list z.B. zuweisen zu einer anderen CList<CString,CString list2 ?
list2= list;
^ So geht das nicht da ich eine Fehlermeldung bekomme
-
1) So sollte das aussehen, aber da ich Punkt 2 sehe, denke ich, dass Punkt1 auch nicht geht. Hat CList keinen Zuweisungsoperator? (Hab nachgesehen, hat tatsächlich keinen)
Ohne Zuweisungsoperator wird Punkt 2 nicht, oder wenn, dann nur fehlerhaft funktionieren (Vom Compiler erzeugter Zuweisungsoperator gibt einfach die Pointer per Wert weiter, wenn dann eine der Listen zerstört wird, hat die andere nur noch Schrott).
In dem Fall würde ich das zurückgeben als Returnwert komplett vergessen.
Wenn du eine Liste in einer Funktion füllen willst, mach es so:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14
void FunktionTuWas( CList<CString,CString>& liste ) { // dann einfach damit arbeiten liste.AddHead( ... ); } // Aufruf: CList<CString,CString> meineListe; FunktionTuWas( meineListe ); // meineListe ist jetzt gefüllt..
Nachtrag zu Punkt 2:
Es scheint ja nicht mal einen Copy-Befehl für CList zu geben. Wenn du eine zweite Liste mit den Werten füllen willst, musst du wohl die Elemente einzeln rüberpacken.
Versuch doch mal die STL std::list, die kann das alles. Die Handhabung ist zwar manchmal besch......eiden, aber dafür kann sie die wichtigen Dinge für Zuweisung.Geändert von Endurion (21.10.04 um 10:30 Uhr)
-
vielen dank, eine frage noch
CList<CString,CString> list;
list ermöglicht mir doch das ich 2 Strings abspeichern kann oder ? kann ich auch CList<CString> list benutzen ?
Denn ich habe ein CListCtrl Steuerelement, wo ich jedes Spalte bzw Zeilde editieren kann (ausgenommen der ersten). Deshalb möchte ich denn index, welcher in der ersten Spalte steht, merken bzw. zwischenspeichern. Ziel ist es denn Speichervorgang in die Datenbank zu beschleunigen. Es wird nur das abgespeichert was verändert wurde.
-
Nein,
CList<CString, CString> ist ein Template einer Liste mit String Objekten. Das erste CString gibt den Typ an, der in der Liste verwaltet wird, das zweite den Argumenttyp, den du z.B. bei AddHead als Argument an die Methode übergibst.
Übrigens gibt es die Klasse CStringList mit derselben Funktionalität, aber nicht als Template.
-
d.h. ich kann dann für meine obige Anwendung CStringList verwenden...
-
Ja, tut dasselbe.
Zu deinem Index zurück.
Wenn es sich um lange Listen handelt und du dir den Index der geänderten Einträge merken willst, solltest du CMap verwenden, anstelle von CList. Dann kannst du schnell eindeutige Einträge darin ablegen ohne auf Duplikate prüfen zu müssen.
-
geil
dass muss man schon wissen.. und wie ist das mit denn Datentypen für CMap ?
Die Index die ich benutze sind vom Typ CString.. funktioniert das mit CMap ?
ich hab eine klasse in der die CStringList gefüllt werden soll. CMap sieht kompliziert aus und hab auch keine Ahnung wie ich das hier mit CMap realisieren soll.
Initialisierung
Code :1 2 3 4
.. public: CStringList Index; ..
Code:
Code :1 2 3 4
void Funktion (CString string) { Index.AddTail(string); }
Ein Object dieser Klasse wird schliesslich in meine anderen klasse erzeugt. Das problem ist .. wie habe ich zugriff dann auf CMap Wie kann ich nun auf Index in einer anderen Klasse zugreifen ?
Am besten ich baue ne Funktion die mir Index zurückliefert oder ?
Code :1 2 3 4
CStringList GetIndex() { return Index; }Geändert von Indian (21.10.04 um 16:54 Uhr)
-
CList und CMap besitzen keinen Copykonstruktor und keinen Copy Operator. Das heisst, du kannst diese Objekte nicht bei value übergeben bzw zurückgeben.
Entweder du gibst eine Referenz auf das Objekt zurück oder du kopierst es um.
const CStringList &GetIndex(void)
{
return Index;
}
oder
void GetIndex(CStringList &ndx)
{
ndx.AddTail(Index);
}
Wenn du in diesem Index **eindeutige** Strings speichern musst, würde ich mit CMap arbeiten und erst beim zurückgeben diese CMap in eine Stringlist kopieren.
z.B. mit CMapStringToPtr wobei du den Ptr Anteil nicht brauchst.
CMapStringToPtr Index;
OnIndexChanged(const CString &str)
{
Index.SetAt(str, NULL); // Duplikate werden ersetzt, Ptr Anteil nicht genutzt
}
void GetIndex(CStringList &ndx)
{
CString str; // index string
void *ptr = NULL; // dummy
// hole alle eingetragenen Strings und kopiere sie in die Stringliste
for(POSITION pos = Index.GetStartPosition(); pos != NULL; Index.GetNextAssoc(pos, str, ptr))
{
ndx.AddTail(str);
}
}
In der Map könntest du zu jedem String weitere Daten speichern, da der String ein weiteres Objekt bestimmt. Das ist abhängig von der Art der Map. CMapStringToOb, CMapStringToString ...
Mit der Templateversion kannst du dir auch eigene Maps erstellen, was aber meistens nicht notwendig ist.
-
Vielen dank für die ausführliche Erklärung. Ich habe es genauso gemacht wie du es hier geschildert hast.
Bis hier her wird der wert richtig übergeben. Jedoch kann ich beim Debuggen nicht feststellen ob der mit SetAt auch richtig abgespeichert wird. Wenn ich Index im Debug überwache steht unter Objekt - __vfptr CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden *
Code :1 2 3 4
OnIndexChanged(const CString &str) { Index.SetAt(str, NULL); // Duplikate werden ersetzt, Ptr Anteil nicht genutzt }
Beim Aufruf bekomme ich die Werte auch nicht zurück.
Mein Aufruf
Code :1 2 3 4
CStringList EditedRows; m_IDCList.GetEditedRowIndexList(EditedRows); for(POSITION pos = EditedRows.GetHeadPosition(); pos != NULL; ) CString articelNr = EditedRows.GetNext(pos); //get index of edited row
Geändert von Indian (26.10.04 um 10:32 Uhr)
-
CMapStringToPtr hat ein Member m_pHashTable, das deine Objekte verwaltet und ein m_nCount anhand dessen du siehst wieviele Objekte eingetragen sind.
Wenn du das nicht siehst, ist die Map dort, wo du sie im Debugger betrachtest, nicht mehr gültig.
Ich nehm mal an, dass du in der m_IDCList die geänderten Strings in einer Map speicherst.
Wenn du diese Liste mit GetEditedRowIndexList(EditedRows) holst, musst du sie dort in die Stringliste kopieren.
...::GetEditedRowIndexList(CStringList &EditedRows)
{
CString str;
void *ptr = NULL;
for(pos = Index.GetStartPosition(); pos != NULL; )
{
Index.GetNextAssoc(pos, str, ptr);
EditedRows.AddTail(str);
}
}
-
also ich habs sie so kopiert
Code :1 2 3 4 5 6 7 8 9 10 11
void CSortListCtrl::GetEditedRowIndexList(CStringList &strList) { CString str; // index string void *ptr = NULL; // dummy // hole alle eingetragenen Strings und kopiere sie in die Stringliste for(POSITION pos = Index.GetStartPosition(); pos != NULL; Index.GetNextAssoc(pos, str, ptr)) { strList.AddTail(str); } }//end GetEditedRowIndexList
irgendwas läuft schief und beim Debuggen bekomme ich auch keine Werte angezeigt. Auch in der Hash Tabelle nicht.
Code :1 2 3 4 5 6 7 8 9 10 11
void CSortListCtrl::SetEditedRowIndex(const CString &str) { Index.SetAt(str, NULL); // eingebaut wegen debug String test; test = "Hallo"; test = test + "du"; }//end SetEditedRowIndex
leider bekam ich hier unter debug auch keine werte angezeigtGeändert von Indian (26.10.04 um 12:25 Uhr)
-
ich denk das die geänderten Strings nicht abgespeichert werden.
Ich denke das hier evtl etwas falsch läuft.
void CSortListCtrl::SetEditedRowIndex(const CString &str)
{
Index.SetAt(str, NULL);
}//end SetEditedRowIndex
-
weist du was. Ich denke das ich hier etwas falsch machen wenn ich versuche die Werte von dem Objekt, des Typs CStringList, abzufragen.
CStringList EditedRows;
m_IDCList.GetEditedRowIndexList(EditedRows);
for(POSITION pos = EditedRows.GetHeadPosition(); pos != NULL; )
CString articelNr = EditedRows.GetNext(pos); //
Ähnliche Themen
-
CString mittels c_str() als Pointer übergeben?
Von Cappaja im Forum VisualStudio & MFCAntworten: 2Letzter Beitrag: 24.06.09, 13:48 -
CString in int
Von thodtie im Forum VisualStudio & MFCAntworten: 1Letzter Beitrag: 04.11.04, 16:55 -
CString von dll dem progamm übergeben
Von Executer im Forum VisualStudio & MFCAntworten: 3Letzter Beitrag: 10.10.04, 20:33 -
CString
Von kerian im Forum C/C++Antworten: 2Letzter Beitrag: 09.10.03, 20:36 -
[C++] MFC: Aus CList geklicktes als CString
Von tefla im Forum C/C++Antworten: 2Letzter Beitrag: 26.09.03, 13:04





Zitieren
Login






