Include und Protoypen Problem
-
Folgende des Problem ( Quellcode etwas verkürzt da gestellt )
Form1.h erzeugt CreateCar. Für CreateCar will ich einen Konstruktor bauen der als Übergabeparameter Form1 haben soll.
Folgendes habe ich schon versucht was immer zu Compilierungsfehlern geführt hat.
-Gegenseitiges include
-versucht einen Prototyp zu erstellenForm1.h
#pragma once #include <direct.h> #include <string.h> #include "CreateCar.h" namespace Fahrtenbuch { /// <summary> /// Zusammenfassung für Form1 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); this->CreateWorkPath(); } protected: /// <summary> /// Verwendete Ressourcen bereinigen. /// </summary> ~Form1() { if (components) { delete components; } } private: System::Void NewButton_Click(System::Object^ sender, System::EventArgs^ e) { CreateCar ^NewWindow= gcnew CreateCar; NewWindow->ShowDialog(this); } }; }
CreateCar.h
#pragma once namespace Fahrtenbuch { using namespace Fahrtenbuch; 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 CreateCar /// </summary> public ref class CreateCar : public System::Windows::Forms::Form { public: CreateCar(void) { InitializeComponent(); // //TODO: Konstruktorcode hier hinzufügen. // } CreateCar(Form1 f1)// Problemstelle { InitializeComponent(); } protected: /// <summary> /// Verwendete Ressourcen bereinigen. /// </summary> ~CreateCar() { if (components) { delete components; } } }; }
-
Du musst deine Sourcen in *.h und *.cpp aufteilen und dann mit Vorwärtdeklarationen arbeiten.
Simon
-
Da heißt einen gemeinsamen Header bauen?
Und wie deklariere Vorwärts`?DANKE=)
-
Da heißt einen gemeinsamen Header bauen?
Nein.
-
Also die Header werden ja automatisch vom System angelegt weil es ja Forms sind. Wie kann man denn dort ein Prototyp definieren das ich es nun irgendwie compiliert bekomme?
class a; //prototyp
Dieser Prototyp funktioniert nicht, stehe aktuell etwas auf dem Schlauch.
-
Hier ein Bsp:
Foo.h
#pragma once ref class Bar; ref class Foo { public: void setBar(Bar^ bar); void useBar(); void test(); private: Bar^ _bar; };
Foo.cpp
#include "stdafx.h" #include "Foo.h" #include "Bar.h" using namespace System; void Foo::setBar(Bar^ bar) { _bar = bar; } void Foo::useBar() { _bar->test(); } void Foo::test() { Console::WriteLine("Foo::test()"); }
Bar.h
#pragma once ref class Foo; ref class Bar { public: Bar(Foo^ foo); void useFoo(); void test(); private: Foo^ _foo; };
Bar.cpp
#include "stdafx.h" #include "Bar.h" #include "Foo.h" using namespace System; Bar::Bar(Foo^ foo) : _foo(foo) { _foo->setBar(this); } void Bar::useFoo() { _foo->test(); } void Bar::test() { Console::WriteLine("Bar::test()"); }
main.cpp
#include "stdafx.h" #include "Foo.h" #include "Bar.h" using namespace System; int main(array<System::String ^> ^args) { Foo^ foo = gcnew Foo(); Bar^ bar = gcnew Bar(foo); foo->useBar(); bar->useFoo(); return 0; }
-
Ja das mir alles vom Prinzip klar. Habe es nun so gemacht
#ifndef CREATECAR_H #define CREATECAR_H #pragma once ref class Form1; namespace Fahrtenbuch { using namespace Fahrtenbuch; 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 CreateCar /// </summary> public ref class CreateCar : public System::Windows::Forms::Form { public: CreateCar(void) { InitializeComponent(); // //TODO: Konstruktorcode hier hinzufügen. // } /* CreateCar(Form1 f1)// Problemstelle { InitializeComponent(); }*/ } #include "Form1.h" #endif
Und Compiler spuckt folgende Fehlermeldung aus "error C2872: 'Form1': Mehrdeutiges Symbol"
-
Unter der Annahme, dass Form1 auch im Namespace Fahrtenbuch ist, sollte die Vorwärtsdekl. wie folgt aussehen:
namespace Fahrtenbuch { ref class Form1; // ... }
-
Okay danke das funktioniert. Jetzt muss ich nur noch raus bekommen das es kein Problem mehr bei dem Aufruf gibt, aber da denke ich erstmal selbst drüber nach