foreach in C++?
-
foreach kapselt nur die IEnumerator/IEnumerable Funktionalitäten, die kannst du nach bilden indem du z.B. in einer Kollektion GetEnumerator aufrufst und dann mit MoveNext und Current alle Elemente abrufst.
-
Danke für die Antworten!
Hab den Quelltext bei mir eingebaut und er scheint zu funktionieren!
Ich bin mit dem Übersetzten des Quelltextes von http://www.codeproject.com/cs/miscctrl/loadandsave.asp noch nicht ganz fertig da ich Probleme mit folgendem Befehl habe (ich weiß nicht, was das ic C# bewirkt).(parts ist ein string-Objekt)
[cs]if (n.Text.Equals(parts[parts.Length - 2].ToString()))
{
// ParentNode setzen
parentNode = n;
// ende
return;
}[/cs]Mein Versuch:
[cpp]if (n->Text->Equals(parts->Substring(0, parts->Length - 2)))
{
// ParentNode setzen
parentNode = n;
//ende
return;
}[/cpp]Der Compiler meldet keinen Fehler, aber es funktioniert irgendwie nicht!
-
Talla schrieb:
Eien Entsprechnung für foreach in C++ gibts nicht aber es ist kein Problem die Schleife umzuschreiben in eine einfache for Schleife.
for(int i = 0; i < tree.Nodes.Count; i++) { saveNode(tree.Nodes[i], al); }
In C++ müsste es dann praktisch genauso aussehen.
Falsch, die Standard C++ Library unterstützt foreach und diese gehört genau so zum C++ Standard wie der Syntax.
Ansonsten ist das Forum falsch gewählt, suche einfach nach C++ und foreach bzw. for_each.MfG Eisflamme
-
Foreach ist kein Sprachmittel von C++! Du hast ja sogar selber geschrieben dass es in die Standardlibrary gehört, und Sprache an sich und Klassenbibliothek ist nen himmelweiter Unterschied.
-
Ich habe doch schon eine funktionierende Lösung für FOREACH.
Mein weiteres Problem bezieht sich auf den String, den ich im letzten Beitrag geposetet hatte ...
-
Ich könnt schwören der Beitrag war vorher noch nicht da
hab den echt nicht gesehen sorry. Aber du hast den Code falsch übersetzt.
Der C# Code vergleicht n.Text mit den vorletzten Buchstaben von parts.
Der C++ Code dagegen vergleicht n.Text mit dem String parts von der ersten bis zur vorletzten Stelle.mfg Karsten
-
Talla schrieb:
Foreach ist kein Sprachmittel von C++! Du hast ja sogar selber geschrieben dass es in die Standardlibrary gehört, und Sprache an sich und Klassenbibliothek ist nen himmelweiter Unterschied.
Hmm? Da irrst du aber.
-
@Talla Kein Problem!
Ich werde morgen den Quelltext verbessern (ist heute zu spät). Sobalt das Teil funktioniert poste ich den mal vollständig hier im Forum
.
-
schrieb:
Talla schrieb:
Foreach ist kein Sprachmittel von C++! Du hast ja sogar selber geschrieben dass es in die Standardlibrary gehört, und Sprache an sich und Klassenbibliothek ist nen himmelweiter Unterschied.
Hmm? Da irrst du aber.
Wobei? Foreach ist kein Sprachmittel von C++. Und das zwischen Sprache an sich und Klassenbibliothek nen Unterschied ist dürfte doch auch klar sein oder?
-
Ok, das Problem mit dem String habe ich jetzt gelöst!
Nun habe ich folgenden Quelltext das Problem, dass ich das Schlüsselwort ref nicht zu übersetzen weiß. Laut MSDN wird dadurch die entsprechende Variable in der aufrufenden Funktion geändert. Meine erster Gedanke war deshalb, Zeiger zu verwenden, aber ich habe wiederum keinen Idee, wie dass gehen sollte, da die normale Deklaration, bereits mit Zeigern zu tun hat.
private static void searchNode(string[] parts, ref TreeNode parentNode, TreeNodeCollection nodes)
private static void searchNode(String * parts[], TreeNode * parentNode, TreeNodeCollection * nodes)
-
Also,
ich habe den Quelltext nun vollständig übersetzt.
Aber ich habe festgestellt, dass bereits das Original anscheinend einen Bug hat: Haben nämlich die Knoten im TreeView alle den gleichen Text, so kann die load-Funktion sie nicht mehr unterscheiden und packt alle Elemente in die gleiche Ebene!Ich habe mich noch mal auf der Quellseite umgesehen und in einem Kommentar http://www.codeproject.com/cs/miscctrl/loadandsave.asp#xx461059xx entdeckt, dass es eine vorgefertigte Speicherfunktion geben soll!
Jetzt stelle ich mir die Frage, was einfacher ist: Versuchen den Bug zu beheben, oder die vorgefertigte Speicherfunktion zu verwenden.
-
Talla schrieb:
Foreach ist kein Sprachmittel von C++! Du hast ja sogar selber geschrieben dass es in die Standardlibrary gehört, und Sprache an sich und Klassenbibliothek ist nen himmelweiter Unterschied.
himmelweit? Der wird ziemlich marginal sein, C++ besteht halt ohne die SC++L (ich genehmige mir mal die Abkürzung) nur aus sehr einfachem Syntax. Und wenn for_each in anderen Sprachen unterstützt wird, dann bedeutet das halt nur, dass die auch größere Funktionen so kennzeichnen, als gehörten sie direkt dazu.
Ansonsten ist da praktisch überhaupt kein Unterschied, ob das ein Schlüsselwort oder eine Funktion ist, die SC++L gehört schließlich genau so zum C++ Standard.Ende der Diskussion
Ansonsten schieb das einer nach C++-Forum
MfG Eisflamme
-
Kann hier Mis2Com nur zustimmen.
-
Nun, ich habe jetzt herausgefunden, dass es eine einfache Möglichkeit gibt, ein komplettes Objekt mit sämtlichen Membern zu speichern.
Hier der Quelltext dafür http://www.developer.com/net/cplus/article.php/3350931.
So wie es dort demonstriert wird funktioniert es auch bei mir. Mein Ziel ist es aber, ein Steuerelement der Form also ein Objekt aus System::Windows::Forms zu serialisieren.
Also habe ich das angegebene Objekt einfach durch das TreeView-Steuerelement ersetzt:
formatter->Serialize(stream, progammer /*Beispielklasse*/);
formatter->Serialize(stream, treeView1);
Lies sich auch Kompilieren, aber zur Laufzeit kam folgende Fehlermeldung:
Eine nicht behandelte Ausnahme des Typs 'System.Runtime.Serialization.SerializationException' ist in Screen.exe aufgetreten.
Zusätzliche Informationen: Der Typ System.Windows.Forms.TreeView in Assembly System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ist nicht als serialisierbar markiert
-
Damit dies funktioniert, muss eine Klasse als Serialiseable markiert werden. Was bei TreeView nicht der Fall ist.
-
Kann man denn diese Markierung nachträglich selbst zu dieser Klasse hinzufügen. Wenn ja - was muss ich dann machen?
-
-
Danke, ich werde mir das gleich mal ansehen ...
-
Hallo,
ich habe nun eine Möglichkeit gefunden, den Inhalt eines TreeViews zu speichern.
Hier die Funktionen zum Öfnen und Speichern:
void SaveTreeViewToDevice(TreeView * tree) { Stream * stream = new FileStream(S"datei.dat", FileMode::Create, FileAccess::ReadWrite); BinaryFormatter* formatter = new BinaryFormatter(); ArrayList * al = new ArrayList(); for (int i = 0; i < tree->Nodes->get_Count(); i++) { al->Add(tree->Nodes->Item[i]); } formatter->Serialize(stream, al); stream->Close(); }
void OpenTreeViewFormDevice(TreeView * tree) { tree->Nodes->Clear(); Stream * stream = new FileStream(S"datei.dat", FileMode::Open, FileAccess::Read, FileShare::Read); BinaryFormatter * formatter = new BinaryFormatter(); ArrayList * tempAl = static_cast<ArrayList *>(formatter->Deserialize(stream)); for (int i = 0; i < tempAl->get_Count(); i++) { tree->Nodes->Add(static_cast<TreeNode *>(tempAl->get_Item(i))); } }
-
Talla schrieb:
Foreach ist kein Sprachmittel von C++! Du hast ja sogar selber geschrieben dass es in die Standardlibrary gehört, und Sprache an sich und Klassenbibliothek ist nen himmelweiter Unterschied.
Soweit ich richtig informiert bin, ist die STL inzwischen Bestandteil des C++ Standards.