CList<CString,CString> list; einer Funktion übergeben ?

Indian

Erfahrenes Mitglied
Hi

ich hab ein problem. Ich habe eine Klasse in dem Daten in einer Variable vom Typ
CList<CString,CString> speichere. Diese heist

Code:
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:
"return list;"

machen


Thx Indian
 
return list geht.

Beim Übergeben würde ich wenn möglich Referenzen benutzen:

Code:
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:
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.
 
Zuletzt bearbeitet:
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.
 
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:
..
public: 
       CStringList Index;
..

Code:
Code:
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:
CStringList GetIndex()
{
   return Index;
}
 
Zuletzt bearbeitet:
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.
 
Zurück