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 erstellen

    Form1.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


Anmelden zum Antworten