Include Problem????
-
Hi, ich bins wieder
Und zwar folgendes, der code hat bis vorhin funktioniert. Nun nicht mehr, nachdem ich ne neue Funktion eingefügt habe. Ich poste mal erst die Fehlermeldungen und dann den Code, den es betrifft (Form1 und eine 2. Form)
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Form1.h(460): error C2065: 'Pruefung_hinzufuegen': nichtdeklarierter Bezeichner
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Form1.h(460): error C2065: 'zeigePruefung_hinzufuegen': nichtdeklarierter Bezeichner
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Form1.h(460): error C2061: Syntaxfehler: Bezeichner 'Pruefung_hinzufuegen'
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Form1.h(461): error C2065: 'zeigePruefung_hinzufuegen': nichtdeklarierter Bezeichner
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Form1.h(461): error C2227: Links von "->ShowDialog" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
Typ ist ''unknown-type''
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Pruefung_hinzufuegen.h(155): error C3767: "Correctus::Form1::addToFaecher": Auf mögliche Funktion(en) kann nicht zugegriffen werden.
Prüfung.cpp
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Pruefung_hinzufuegen.h(155): error C2653: 'Form1': Keine Klasse oder Namespace
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Pruefung_hinzufuegen.h(155): error C3861: "addToFaecher": Bezeichner wurde nicht gefunden.
Code wird generiert...nun der Code:
#pragma once #include "stdafx.h" #include "AntwortDaten.h" #include "Pruefung_hinzufuegen.h" namespace Correctus { 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 { private: List<AntwortDaten^> ^faecher; private: System::Windows::Forms::ToolStripMenuItem^ neuePruefungenHinzufuegenToolStripMenuItem; public: Image ^img; Form1(void) { InitializeComponent(); faecher = gcnew List<AntwortDaten^>(); usw... //hier wird eine neue Prüfung dem Array hinzugefügt System::Void neuePruefungenHinzufuegenToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { Pruefung_hinzufuegen^ zeigePruefung_hinzufuegen = gcnew Pruefung_hinzufuegen(); zeigePruefung_hinzufuegen->ShowDialog(); } void addToFaecher(AntwortDaten^ neuePruefung) { faecher->Add(neuePruefung); } }; }
das ist form1, nun zur zweiten:
#pragma once #include "stdafx.h" #include "AntwortDaten.h" #include "Form1.h" #include <iostream> using namespace std; namespace Correctus { usw... private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { if(textBox1->Text !="" && textBox2->Text != "" && textBox3->Text != "") { String^ pruefungsFach = textBox1->Text; String^ sem = textBox2->Text; String^ pruefungsName = textBox3->Text; Form1::addToFaecher(AntwortDaten::AntwortDaten(pruefungsFach, sem, pruefungsName)); } else { // MessageBox->Show( "hast was vergessen."); } this->Close(); } }; }
seht ihr da einen fehler? ich weiß nun nicht ob der iostream überhaupt gebraucht wird, aber die fehler erscheinen mir fragwürdig, da ja der namensraum auch derselbe ist...
-
ok, das mit der sichtbarkeit hab ich eben gemerkt, aber hab folgende fehlermeldung nun:
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Form1.h(464): warning C4677: "addToFaecher": Die Signatur des nicht privaten Members enthält den privaten Assemblytyp "Correctus::AntwortDaten".
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(9): Siehe Deklaration von 'Correctus::AntwortDaten'
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Form1.h(460): error C2065: 'Pruefung_hinzufuegen': nichtdeklarierter Bezeichner
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Form1.h(460): error C2065: 'zeigePruefung_hinzufuegen': nichtdeklarierter Bezeichner
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Form1.h(460): error C2061: Syntaxfehler: Bezeichner 'Pruefung_hinzufuegen'
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Form1.h(461): error C2065: 'zeigePruefung_hinzufuegen': nichtdeklarierter Bezeichner
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Form1.h(461): error C2227: Links von "->ShowDialog" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
Typ ist ''unknown-type''
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Pruefung_hinzufuegen.h(155): error C2664: 'Correctus::Form1::addToFaecher': Konvertierung des Parameters 1 von 'Correctus::AntwortDaten' in 'Correctus::AntwortDaten ^' nicht möglich
Es ist kein benutzerdefinierter Konvertierungsoperator verfügbar, oder
Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden
Prüfung.cpp
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Pruefung_hinzufuegen.h(155): error C2653: 'Form1': Keine Klasse oder Namespace
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Pruefung_hinzufuegen.h(155): error C3861: "addToFaecher": Bezeichner wurde nicht gefunden.
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Form1.h(464): warning C4677: "addToFaecher": Die Signatur des nicht privaten Members enthält den privaten Assemblytyp "Correctus::AntwortDaten".
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(9): Siehe Deklaration von 'Correctus::AntwortDaten'
Code wird generiert...
-
jetzt verzweifel ich langsam. Ich hab folgende Codes:
#pragma once #include "StdAfx.h" #include "Antwort.h" using namespace System::Collections::Generic; using namespace System; namespace Correctus { ref class AntwortDaten { private: String^ fach; String^ pruefungsName; String^ semester; List<Antwort^> ^antworten; public: AntwortDaten(String^ pruefungsFach, String^ sem, String^ name); void setzeNeueAntwort(String^ aw); String^ getFach(); String^ getPruefungsName(); String^ getSemester(); String^ setFach(); String^ setPruefungsName(); String^ setSemester(); }; } und die cpp dazu #include "StdAfx.h" #include "AntwortDaten.h" namespace Correctus { //Kostruktor für Array AntwortDaten::AntwortDaten(String^ pruefungsFach, String^ sem, String^ name) { antworten = gcnew List<Antwort^>(); fach = pruefungsFach; semester = sem; pruefungsName = name; antworten->Add(gcnew Antwort("1. 3254")); antworten->Add(gcnew Antwort("2. 32")); antworten->Add(gcnew Antwort("3. 324")); antworten->Add(gcnew Antwort("4. 254")); antworten->Add(gcnew Antwort("5. 325")); } // Methode für das Hinzufügen der neuen Antworten void AntwortDaten::setzeNeueAntwort(String^ aw) { antworten->Add(gcnew Antwort(aw)); } String^ getFach() { return fach; } String^ getPruefungsName() { return pruefungsName; } String^ getSemester(){ return semester; } void setFach(String^ fach){ fach = fach; } void setPruefungsName(String^ name){ pruefungsName = name; } void setSemester(String^ sem){ semester = sem; } }
und das sind die fehlermeldungen dazu. und das versteh ich nicht mehr...
AntwortDaten.cpp
AntwortDaten.cpp(26): error C2065: 'fach': nichtdeklarierter Bezeichner
AntwortDaten.cpp(29): error C2065: 'pruefungsName': nichtdeklarierter Bezeichner
AntwortDaten.cpp(32): error C2065: 'semester': nichtdeklarierter Bezeichner
AntwortDaten.cpp(35): error C2065: 'fach': nichtdeklarierter Bezeichner
AntwortDaten.cpp(38): error C2065: 'pruefungsName': nichtdeklarierter Bezeichner
AntwortDaten.cpp(41): error C2065: 'semester': nichtdeklarierter Bezeichner
Pruefung_hinzufuegen.cppwarum erkennt er die ganzen Variablen nicht mehr obwohl die header includiert ist???
-
Beispielhaft:
String^ getFach() { return fach; }
String^ AnwortDaten::getFach() { return fach; }
-
ok, hab ich nun geändert. sind aber lustigerweise andere fehler aufgetreten. und ich weiß nicht warum ich nun mehrere methoden habe, die sich kaum unterscheiden.. -.-
AntwortDaten.cpp(34): error C2556: 'void Correctus::AntwortDaten::setFach(System::String ^)': Überladene Funktion unterscheidet sich nur hinsichtlich des Rückgabetyps von 'System::String ^Correctus::AntwortDaten::setFach(System::String ^)'
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(22): Siehe Deklaration von 'Correctus::AntwortDaten::setFach'
AntwortDaten.cpp(34): error C2373: 'Correctus::AntwortDaten::setFach': Neudefinition; unterschiedliche Modifizierer
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(22): Siehe Deklaration von 'Correctus::AntwortDaten::setFach'
AntwortDaten.cpp(37): error C2556: 'void Correctus::AntwortDaten::setPruefungsName(System::String ^)': Überladene Funktion unterscheidet sich nur hinsichtlich des Rückgabetyps von 'System::String ^Correctus::AntwortDaten::setPruefungsName(System::String ^)'
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(23): Siehe Deklaration von 'Correctus::AntwortDaten::setPruefungsName'
AntwortDaten.cpp(37): error C2373: 'Correctus::AntwortDaten::setPruefungsName': Neudefinition; unterschiedliche Modifizierer
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(23): Siehe Deklaration von 'Correctus::AntwortDaten::setPruefungsName'
AntwortDaten.cpp(40): error C2556: 'void Correctus::AntwortDaten::setSemester(System::String ^)': Überladene Funktion unterscheidet sich nur hinsichtlich des Rückgabetyps von 'System::String ^Correctus::AntwortDaten::setSemester(System::String ^)'
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(24): Siehe Deklaration von 'Correctus::AntwortDaten::setSemester'
AntwortDaten.cpp(40): error C2373: 'Correctus::AntwortDaten::setSemester': Neudefinition; unterschiedliche Modifizierer
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(24): Siehe Deklaration von 'Correctus::AntwortDaten::setSemester'
Pruefung_hinzufuegen.cpp
-
Ey.. selber Fehler finden bringt dich weiter..
Im Header- File:
String^ setFach();
Im Source- File:
void setFach(String^ fach){ fach = fach; }
Tja, da stimmt doch was nicht, oder?
-
weiß ich, deshalb hatte ich ja auch geändert auf folgendes.
String^ AntwortDaten::getFach() { return fach; } String^ AntwortDaten::getPruefungsName() { return pruefungsName; } String^ AntwortDaten::getSemester(){ return semester; } void AntwortDaten::setFach(String^ pruefFach){ fach = pruefFach; } void AntwortDaten::setPruefungsName(String^ name){ pruefungsName = name; } void AntwortDaten::setSemester(String^ sem){ semester = sem; } und header : String^ getFach(); String^ getPruefungsName(); String^ getSemester(); void setFach(String^ pruefFach); void setPruefungsName(String^ name); void setSemester(String^ sem);
-
habs grad gemerkt. bleiben aber immernoch die fehler bezüglich der klasse Pruefung_hinzufuegen über...
-
Ja, dann zeig die mal...
-
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Form1.h(464): warning C4677: "addToFaecher": Die Signatur des nicht privaten Members enthält den privaten Assemblytyp "Correctus::AntwortDaten".
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\AntwortDaten.h(9): Siehe Deklaration von 'Correctus::AntwortDaten'
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Form1.h(460): error C2065: 'Pruefung_hinzufuegen': nichtdeklarierter Bezeichner
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Form1.h(460): error C2065: 'zeigePruefung_hinzufuegen': nichtdeklarierter Bezeichner
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Form1.h(460): error C2061: Syntaxfehler: Bezeichner 'Pruefung_hinzufuegen'
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Form1.h(461): error C2065: 'zeigePruefung_hinzufuegen': nichtdeklarierter Bezeichner
c:\users\ajacobs\documents\visual studio 2010\projects\prüfung\prüfung\Form1.h(461): error C2227: Links von "->ShowDialog" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
Typ ist ''unknown-type''das sind die fehlermeldungen.
die warnung kann ich ja getrost überlesen vorerst. das problem bestand auch schon vorher. das schlimme ist, das programm hats so schon getahn und auf einmal nicht mehr...
das is der kopf: #pragma once #include "stdafx.h" #include "AntwortDaten.h" #include "Pruefung_hinzufuegen.h" namespace Correctus { 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 {...... und das, die problemsteelle: System::Void neuePruefungenHinzufuegenToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { Pruefung_hinzufuegen^ zeigePruefung_hinzufuegen = gcnew Pruefung_hinzufuegen(); zeigePruefung_hinzufuegen->ShowDialog(); } public: void addToFaecher(AntwortDaten^ neuePruefung) { faecher->Add(neuePruefung); } }; }
hab das mal eben mit auskommentieren der funktion probiert und es sind immernoch die probs da. der erstellt mitmal einfach die zweite form nicht mehr...
-
1. StdAfx.h soll nur in CPP Dateien includiert werden.
2. Also, Schritt für Schritt:error C2065: 'Pruefung_hinzufuegen': nichtdeklarierter Bezeichner
- Header inkludiert? Ja.
- Ist der gefragte Typ tatsächlich in diesem Header File definiert?
- Ist der gefragte Typ ev. in einem andern Namespace?
- Liegt ev. ein Schreibfehler vor?
- ...
-
theta schrieb:
1. StdAfx.h soll nur in CPP Dateien includiert werden.
2. Also, Schritt für Schritt:error C2065: 'Pruefung_hinzufuegen': nichtdeklarierter Bezeichner
- Header inkludiert? Ja.
- Ist der gefragte Typ tatsächlich in diesem Header File definiert?
- Ist der gefragte Typ ev. in einem andern Namespace?
- Liegt ev. ein Schreibfehler vor?
- ...also, ums kurz zu machen,
- header includiert
- definitiv keine schreibfehler, da es genau SO funktioniert hat und ich nichts mehr dran geändert habe außer die funktion in der 1. form zu schreiben und die funktion in der 2. form (pruefung_hinzufuegen.h) zu ändern, damit das array befüllt wird. das ist ja mein problem grad. ich seh keinen fehler. Gerade weil es schon genau SO funktioniert hat bei dem ersten test als ich das ganze erstellt hatte.
-
#pragma once #include "stdafx.h" #include "AntwortDaten.h" #include "Form1.h" #include <iostream> using namespace std; namespace Correctus { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// Zusammenfassung für Pruefung_hinzufuegen /// </summary> public ref class Pruefung_hinzufuegen : public System::Windows::Forms::Form { public: Pruefung_hinzufuegen(void) { InitializeComponent(); // //TODO: Konstruktorcode hier hinzufügen. // } ...
das is die header. namespace hab ich auch erst gedacht, dann schreibweise und dann referenz. aber is ja nichts verändert worden...
-
So, Du hast eine zirkuläre Abhängigkeit der Headerfiles erzeugt:
Form1.h inlkudiert Pruefung_hinzufuegen.h inkludiert Form1.h ...
Benötigt Pruefung_hinzufuegen das Form1.h Headerfile?
Falls es wirklich so ist löst man das typischerweise mit Vorwärtsdeklaration.
-
eine was hab ich erzeugt????
naja, ich muss in der form2 ein array aus form 2 verändern, ich muss die prüfungen dem array hinzufügen, danach dann die entsprechende prüfung auswählen und dann antworten hinzufügen. ist etwas umständlich, aber geht in der vorabversion nicht anders. is aber noch nich alles implementiert. Das Array befindet sich in der Form1.h, und ist dann ja von form2 aus nicht erreichbar, wenn ich das nich gegenseitig includiere, aber müsste sich das nicht eig ausschalten, durch das #pragma once? das ist doch dafür da sowas zu verhindern... oder nicht?
-
Aj2010,
du scheinst die grundlegendsten Dinge von C++ noch nicht zu beherrschen und willst dann schon GUI programmieren, geschweige denn C++/CLI.
theta, dass du dir das hier antust... (ich glaube, das wird hier selber ein Thread mit zirkulären Abhängigkeiten
-
theta, dass du dir das hier antust... (ich glaube, das wird hier selber ein Thread mit zirkulären Abhängigkeiten
Das glaube ich allerdings auch langsam..
-
eine was hab ich erzeugt????
Google doch danach.
Du kannst z.B. das besagte Array (besser Liste) ja via Konstruktor von Pruefung_hinzufuegen übergeben. So wird es direkt bearbeitet.
Dann entfällt die Abhängigkeit nach Form1.
Simon
-
problem ist, ich hab mit java angefangen, dann mit c# gearbeitet und nun muss ich in kürzester zeit c++ intus bekommen und die software schreiben. was ne zirkuläre abhängigkeit is hab ich ne vorstellung, und zwar, dass beide voneinander abhängen. und zwar immer und immer wieder. kann auch sein, dass ich gestern müde war. warte mal, mir is da grade was über die zeiger eingefallen. ich brauch ja eigentlich nur nen zeiger zu dem adressblock des arrays nehmen um mein problem zu umgehen. müsste dann ja das problem lösen, da ich ja ein und das selbe objekt behandel und kein neues. nun wird mir auch klar wofür man überhaupt einen zeiger auf ein objekt mitgeben sollte... weil ich hab da keinen sinn drin gesehen. schon bei c# nicht...
wäre das ne möglichkeit? und ich hab jetzt mal ne frage... lässt mich ein wenig dumm da stehen aber ich wurde eben beim lesen über zeiger verwirrt, kann mir mal einer den unterschied zwischen '^', '*', '&' nennen?'*' soll ein zeiger darstellen und '&' eine referenz, aber was ist mit '^'? is das sowas wie nen zeiger?
edit 10:43Uhr : So, Programm läuft, mit zeigern auf das ursprüngliche objekt... und nein, ich weiß weder warum das auf einmal funktioniert, noch warum gerade diese zeichen verwendet wurden.
weg ist folgender.public ref class Form1 : public System::Windows::Forms::Form { private: List<AntwortDaten^> ^faecher; private: System::Windows::Forms::ToolStripMenuItem^ neuePruefungenHinzufuegenToolStripMenuItem; public: Image ^img; Form1(void) { InitializeComponent(); faecher = gcnew List<AntwortDaten^>(); ... -> System::Void neuePruefungenHinzufuegenToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { Pruefung_hinzufuegen^ zeigePruefung_hinzufuegen = gcnew Pruefung_hinzufuegen(faecher); zeigePruefung_hinzufuegen->ShowDialog(); } ... -> public ref class Pruefung_hinzufuegen : public System::Windows::Forms::Form { List<AntwortDaten^> ^faecher; public: Pruefung_hinzufuegen(List<AntwortDaten^> ^fach) { InitializeComponent(); faecher = fach; ... -> System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { if(textBox1->Text !="" && textBox2->Text != "" && textBox3->Text != "") { String^ pruefungsFach = textBox1->Text; String^ sem = textBox2->Text; String^ pruefungsName = textBox3->Text; faecher->Add(gcnew AntwortDaten(pruefungsFach, sem, pruefungsName)); } ...
Ich hab keine ahnung warum das funktioniert... aber es funktioniert. ^^ kann mir wer erklären warum welcher zeiger /welche referenz an der stelle richtig ist? *lieb guck*
-
ok, ich hab die bedeutungen, aber kann es sein, dass ich so wie es grad einen höher steht gar nicht das originalobjekt bearbeite sondern einfach eine kopie? ich kann mir das derzeit nicht ausgeben lassen. könnt ihr was dazu sagen? laut buch von stroustrup ist ja * der zeiger und & eine referenz auf ein objekt.
'^' ist ein handlebares objekt. kann mir einer das bestätigen oder zumindest sagen ob ich nun das originalobjekt behandel oder nur eine kopie aufn stack gelegt hab?
-
laut buch von stroustrup ist ja * der zeiger und & eine referenz auf ein objekt.
Schau mal, das verdeutlicht doch nur wieder, dass C++/CLI für Anfänger nicht geeignet ist. Das Buch von Stroustup behandelt C++, kein C++/CLI.
Benutz doch einfach C# oder meinetwegen VB.NET. Oder wenns denn umbedingt sein muss C++ - aber lass die Fniger von C++/CLI.
Simon