Problem mit List und vektoren
-
Es macht keinen Sinn C++/CLI und C++ zu mischen. Es bringt nur unnötige Probleme. Zu mischen macht dann Sinn, wenn es sich um einen Interop Layer handelt, was hier offensichtlich nicht der Fall ist.
Desshlab geht meine Hilfe in Richtig "alles .NET zu machen".
Ich habe das mal so angerissen. Packe die Klasse Antwort, AntwortDaten umbedingt in andere Header / Source Dateien (also nicht in der Datei von Form1).ref class Antwort { private: String^ antwort; bool sichtbar; public: // .. set / get }; ref class AntwortDaten { private: String^ fach; String^ pruefungsName; List<Antwort^>^ antworten; public: // ... set / get }; ref class Form1 : public Form { private: List<AntwortDaten^>^ faecher; public: Form1() { InitializeComponents(); faecher = gcnew List<AntwortDaten^>(); } // ... };
-
entschuldige bitte, dass ich das nicht erwähnt hatte. die cpp/header sind alle unabhängig, da ich das oop gerne behalten wollte. ich kann dir das ja mal eben kurz komplett schicken, wenn du mir deine icq etc gibst... dann is es vllt klarer. is halt mein Prüfungsprojekt. und die prüfung is im sommer..
-
Wie theta schon geschrieben hat, du solltest alle deine Klassen "managed" machen, d.h.
ref class Antwort // sowie "ref class Antwortdaten" { // ... }
Und dann die List so definieren:
List<AntwortDaten^>^ faecher;
Das Verwenden von "nativen" Klassen und "managed" Collections geht nicht (du solltest auch Lernen Fehlermeldungen zu verstehen bzw. danach im Internet bzw. direkt in der MSDN zu suchen).
Sollen deine Klassen "Antwort", "AntwortDaten" usw. dennoch reines C++ ("unmanaged"/ "native") sein, so mußt du die Daten von Hand in die Managed-Liste umkopieren (und dafür dann entsprechende managed-Klassen anlegen - also doppelte Arbeit!).
-
Ahhh. daher das ganze. also wenn Ich die Klassen mit "ref" kennzeichne, dann übernimmt das löschen der Carbarage Controller, wenn ich das jetzt richtig verstehe. was er ja sonst nicht machen würde...oder?
Naja, aus der MSDN werd ich nich wirklich schlau. aus den Fehlermeldungen so halbwegs... ^^ Ich hab hier 4 Bücher vor mir liegen. eins is C# 2010 wegen den Funktionen mit Visual Studio. und der Rest is c++.
einmal "Spielend C++ lernen", dann Visual C++ 2010 vonDirk Louis
und zuguterletzt Einführung in die Programmierung mit C++ von Stroustrup.Ich weiß nicht so ganz ob die Kombi von Büchern Richtig ist. Ich hatte auch das vom mitp Verlag. Da hab ich schon ne Kriese bekommen als ich 2 elementare fehler gelesen habe... ^^ habs zurück gebracht...
Ps:Die Liste muss ja dynamisch bleiben, da Immer neue Datensätze hinzu kommen können.
-
Generell ist C++/CLI zum programmieren Lernen sehr fragwürdig.
Dann kommen noch die ganzen Bücher dazu, die C++/CLI als Sprache zur Applikations- Entwicklung propagieren - sehr schlecht. Und zu guter Letzt die Uni's und Schulen, die C++/CLI Kurse anbieten und nicht mal den Unterschied zwischen C++/CLI und C++ kennen. Grauenhaft.
-
Ich schreib mal die ganze Klasse Antwortdaten jetzt hier rein. Und die dazugehörigen Fehlermeldungen. Ich werd aus der Stelle, wo der Fehler sein soll nicht schlau....
#pragma once #include "StdAfx.h" #include "Antwort.h" #include <iostream> using namespace System::Collections::Generic; using namespace std; namespace Correctus { ref class AntwortDaten { private: String^ fach; String^ pruefungsName; List<Antwort^> ^antworten = gcnew List<Antwort^>(6); public: AntwortDaten(); }; }
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(12): error C2143: Syntaxfehler: Es fehlt ';' vor '^'
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(12): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(12): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(13): error C2143: Syntaxfehler: Es fehlt ';' vor '^'
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(13): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(13): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(14): error C2065: 'Antwort': nichtdeklarierter Bezeichner
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(14): error C2059: Syntaxfehler: '>'
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(14): error C2065: 'Antwort': nichtdeklarierter Bezeichner
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(14): error C2059: Syntaxfehler: '>'
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(19): error C2143: Syntaxfehler: Es fehlt ';' vor '}'
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(20): error C2143: Syntaxfehler: Es fehlt ';' vor '}'
-
theta schrieb:
Generell ist C++/CLI zum programmieren Lernen sehr fragwürdig.
Dann kommen noch die ganzen Bücher dazu, die C++/CLI als Sprache zur Applikations- Entwicklung propagieren - sehr schlecht. Und zu guter Letzt die Uni's und Schulen, die C++/CLI Kurse anbieten und nicht mal den Unterschied zwischen C++/CLI und C++ kennen. Grauenhaft.es ist ja nicht das Problem das zu lernen. Ich finde es nur schwerer.
Das Buch "Spielend C++ lernen" ist sehr gut geschrieben und basiert auch auf c++ CLI. Problem ist, dass die Hauptdatei eine DLL ist und dort schon sehr viele Funktionen vorgearbeitet wurden. Ich denke, das Dass das Problem ist, weshalb man nicht soooo viel lernt... Ich muss dazu sagen, dass Ich Umschüler bin und dass Dieser Beruf mein Traumberuf ist... und ich dafür bereit bin alles dafür zu tun, dass ich ein guter Programmierer werde.
-
Probier mal using namespace System hinzuzufügen.
Dafür kannst Du using namespace std getrost entfernen.
-
So, ausgetauscht ist. Nun liegen für die Klasse folgende Fehler vor. Alles andere beibehalten.
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(14): error C2065: 'Antwort': nichtdeklarierter Bezeichner
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(14): error C2059: Syntaxfehler: '>'
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(14): error C2065: 'Antwort': nichtdeklarierter Bezeichner
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(14): error C2059: Syntaxfehler: '>'
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(19): error C2143: Syntaxfehler: Es fehlt ';' vor '}'
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(20): error C2143: Syntaxfehler: Es fehlt ';' vor '}'
-
Dann zeige mal den Inhalt von Antwort.h.
Ist Antwort auch im Namespace Correctus?Edit
#include <iostream> kannst Du auch entfernen.
-
#pragma once #include "StdAfx.h" using namespace std; namespace Correctus { ref class Antwort { private: String^ antwort; bool^ sichtbar; public: Antwort(string aw); void abgehackt(); String^ getAntwort(); void setAntwort(String^ aw); }; }
und die dazugehörige cpp
namespace Correctus { Antwort::Antwort(String^ aw) { antwort = aw; sichtbar = true; } void Antwort::abgehackt() { sichtbar = false; } String^ Antwort::getAntwort() { return antwort; } void Antwort::setAntwort(String^ aw) { antwort = aw; } }
hab gesehen. using namespace System hat gefehlt. dadurch sind aber andere fehler entstanden.
-
Die Deklaration des Antwort Konstruktors ist noch falsch:
Antwort(string aw);
Antwort(String^ aw);
Und auch using namespace System; nicht vergessen.
Edit
Und auch hier: Dafür kannst Du using namespace std getrost entfernen.
-
Hey, genau dass habe ich in der Zeit schon gemacht als du geschrieben hast ^^
Die Klasse sieht nun so aus.#pragma once #include "StdAfx.h" using namespace System; namespace Correctus { ref class Antwort { private: String^ antwort; bool^ sichtbar; public: Antwort(String^ aw); void abgehackt(); String^ getAntwort(); void setAntwort(String^ aw); }; }
und nun folgen die fehler. haben sich im übrigen schon sehr verringert.
bleiben nur noch die aus der klasse und ei, aus der form über, welche sehr sehr viele sind. ^^Fehler:
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(13): error C3845: "Correctus::AntwortDaten::antworten": Nur statische Datenmember können innerhalb einer Verweisklasse oder eines Werttyps initialisiert werden.
Prüfung.cpp
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(13): error C3845: "Correctus::AntwortDaten::antworten": Nur statische Datenmember können innerhalb einer Verweisklasse oder eines Werttyps initialisiert werden.
-
C++/CLI ist halt weder C++ noch C#, sondern eine eigene Sprache mit eigenen Regeln.
Laut Fehlermeldung mußt du
antworten = gcnew List<Antwort^>(6);
in den Konstruktor reinschreiben (also hier verhält es sich mehr wie C++).
-
und warum ist das dann so??? ich versteh das grad nicht, warum das so ist. kann es sein, dass die definierung immer außerhalb einer funktion sein muss und die deklaration in dem konstruktor? hab jetzt lustigerweise nur noch Fehler in der Form1.h . Auf jedenfall schonmal ein gaaaanz GROOOOßES Danke
-
Das mit den gcnew im Konstruktor wird auch benötigt, würde aber ein Fehler zur Laufzeit verursachen. Soweit bist Du noch nicht.
Bei Dir ist es ein Kompilerfehler.
Du benötigst eine Instanz von AntwortDaten um Antworten etc. hinzufügen zu können. Vermutlich versuchst Du sowas wue AntwortDaten->antworten->Add(gcnew Antwort()); zu machen. Das geht nicht. Du benötigst eine Instanz von AntwortDaten.
Zeige doch mal den Code wo die Antwort und AntwortDaten Klassen verwendet werden.
-
#pragma once namespace Prüfung { #include "AntwortDaten.h" using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::Drawing::Imaging; using namespace System::Collections::Generic; /// <summary> /// Zusammenfassung für Form1 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Image ^img; List<AntwortDaten^> ^faecher; Form1(void) { InitializeComponent(); faecher = gcnew List<AntwortDaten^>();
das ist der Kopf der Form1.h und die Fehler zu dem Bereich, sind Folgende.
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Form1.h(22): error C2065: 'AntwortDaten': nichtdeklarierter Bezeichner
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Form1.h(22): error C2059: Syntaxfehler: '>'
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Form1.h(25): error C2143: Syntaxfehler: Es fehlt ';' vor '{'
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Form1.h(28): error C2061: Syntaxfehler: Bezeichner 'AntwortDaten'Ich denke, der Rest baut sich darauf auf. Die Deklaration sollte eigentlich am richtigen Punkt stehen, oder?
hab den Aufruf glatt vergessen. der ist auch in der Form1.h :private: System::Void pruefungAuswaehlenToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { faecher->Add(gcnew AntwortDaten()); }
-
theta schrieb:
Das mit den gcnew im Konstruktor wird auch benötigt, würde aber ein Fehler zur Laufzeit verursachen. Soweit bist Du noch nicht.
Bei Dir ist es ein Kompilerfehler.
Du benötigst eine Instanz von AntwortDaten um Antworten etc. hinzufügen zu können. Vermutlich versuchst Du sowas wue AntwortDaten->antworten->Add(gcnew Antwort()); zu machen. Das geht nicht. Du benötigst eine Instanz von AntwortDaten.
Zeige doch mal den Code wo die Antwort und AntwortDaten Klassen verwendet werden.
Naja, Ich versuch mal mein Projekt zu abstrahieren. Es soll eine Embedded Software werden. Nächstes Jahr aber erst. Ich bastel jetzt die Vorab Standalone Version. Die Andere Firma, die die Software braucht, wird sie dann einbetten. Das ist an der Stelle nicht mein Problem. Ich soll erstmal eine Lauffähige Version bauen. Die Antworten etc werden dann nächstes Jahr als XML vorliegen. und diese werden dann auch verwendet. Ich hab diese Klassen erstmal als nötig erachtet, da ich das Programm ja irgendwie testen muss. Dafür hab ich dann diese Beiden Klassen eingebaut damit ich Testdaten benutzen kann.
Aber keine Angst, Ich werd in den kommenden 2 Monaten (solange dauert mein Praktikum noch) noch öfter auf euch zurück kommen müssen, da ich die Stifteingabe (tablet PC) noch integrieren muss, ein Overlay basteln muss, welches die schrift als objekt behandelt usw... hab noch nen ganzen haufen Probleme, die ich lösen muss. ^^ werd aber natürlich versuchen soweit alles alleine zu machen wie ich es bisher kann...
-
Das include der AntwortDaten.h muss raus aus dem Namespace.
Edit:
Ausserdem musst Du aufpassen, Du hast einmal Namespace Prüfung (da ist Form1 drin) und einmal den Namespace Correctus (Antwort und AntwortDaten).
-
hab ich mir auch schon gedacht. löst das Problem aber nicht. Hab das Include jetzt über dem namespace und unter dem #pragma once
AntwortDaten ist immernoch ein nichtdeklarierter Bezeichner . Fehler ist immernoch bei der definition. also im public bereich unter image.