Kompiler funktionier nicht richtig



  • Ich habe folgendes Problem:

    Ich habe ein Windows Forms Programm geschrieben und einen weiteren Dialog hinzugefügt. Alles hat wunderbar funktioniert, bis ich einen zweiten Dialog hinzugefügt hab. Danach hab ich nur noch folgende Fehlermeldung bekommen:

    error C2011: 'Dialog1': 'class' Typneudefinition

    und die von der Klasse erzeugte Instanz wird nicht mehr erkannt, was noch 11 andere Fehler nach sich gezogen hat.

    Ich habe auch schon die .h und .cpp Datei des zweiten Dialogs entfernt, der Fehler bleibt aber weiterhin bestehen.



  • Zeige mal deinen Code.



  • Der Windows Forms Designer in C++/CLI ist unbrauchbar, da er den gesamten Code in Header schreibt. Wenn du also einen zweiten Dialog einbaust, und beide sich gegenseitig referenzieren, ist es wahrscheinlich, dass etwas mit der Include-Struktur nicht mehr stimmt und die Fehlermeldung von daher kommt.

    theta schrieb:

    Zeige mal deinen Code.

    Bin auch dafür.

    MfG



  • Da ich jetzt nicht weiß wo der Fehler liegen könnte poste ich einfach mal den gesamten Code (Aus Platzgründen hab ich den Code ein wenig gekürzt):

    Aus Form1.h :

    #include "Dialog1.h"
    
    namespace Update {
    
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    	public:
    
    		static Form1 ^ win = gcnew Form1();
    
    		Form1(void)
    		{
    			InitializeComponent();
    		}
    
    	protected:
    
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    
    	public:  System::Windows::Forms::ListBox^  listBox1;
    	private: System::Windows::Forms::Button^  deleteAllButton;
    	private: System::Windows::Forms::Button^  deleteButton;
    	private: System::Windows::Forms::Button^  updateButton;
    	private: System::Windows::Forms::Button^  insertButton;
    	private: System::Windows::Forms::Label^  UpdateStatus;
    	private: System::Windows::Forms::OpenFileDialog^  openFileDialog1;
    	private: System::ComponentModel::Container ^components;
    
    		void InitializeComponent(void)
    		{
    
    			...
    
    		}
    		System::Void deleteAllButton_Click(System::Object^  sender, System::EventArgs^  e)
    		{
    			System::Media::SystemSounds::Exclamation->Play();
    			Dialog1::dialog1->ShowDialog();
    		}
    		System::Void deleteButton_Click(System::Object^  sender, System::EventArgs^  e)
    		{
    			win->listBox1->Items->Remove(win->listBox1->SelectedItem);
    		}
    		System::Void insertButton_Click(System::Object^  sender, System::EventArgs^  e)
    		{
    			win->openFileDialog1->ShowDialog();
    		}
    		System::Void updateButton_Click(System::Object^  sender, System::EventArgs^  e)
    		{
    			...
    		}
    	};
    }
    

    Aus Dialog1.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;
    
    	public ref class Dialog1 : public System::Windows::Forms::Form
    	{
    	public:
    
    		static Dialog1 ^ dialog1 = gcnew Dialog1();
    
    		Dialog1(void)
    		{
    			InitializeComponent();
    		}
    
    	private: System::Windows::Forms::Button^  buttonYes;
    	private: System::Windows::Forms::Button^  buttonNo;
    	private: System::Windows::Forms::Label^  label1;
    
    		void InitializeComponent(void)
    		{
    			...
    		}
    		System::Void buttonYes_Click(System::Object^  sender, System::EventArgs^  e);
    		System::Void buttonNo_Click(System::Object^  sender, System::EventArgs^  e);
    	};
    

    Aus Dialog1.cpp:

    #include "StdAfx.h"
    #include "Dialog1.h"
    #include "Form1.h"
    
    using namespace Update;
    
    System::Void Dialog1::buttonYes_Click(System::Object^  sender, System::EventArgs^  e)
    {
    	Form1::win->listBox1->Items->Clear();
    	Dialog1::dialog1->Close();
    }
    System::Void Dialog1::buttonNo_Click(System::Object^  sender, System::EventArgs^  e)
    {
    	Dialog1::dialog1->Close();
    }
    

    Aus Dialog2.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;
    
    	public ref class Dialog2 : public System::Windows::Forms::Form
    	{
    	public:
    
    		static Dialog2 ^ dialog2 = gcnew Dialog2();
    
    		Dialog2(void)
    		{
    			InitializeComponent();
    		}
    
    	private: System::Windows::Forms::Button^  buttonOk;
    	private: System::Windows::Forms::Label^  label1;
    
    		void InitializeComponent(void)
    		{
    			...
    		}
    		System::Void buttonOk_Click(System::Object^  sender, System::EventArgs^  e)
    		{
    			dialog2->Close();
    		}
    	};
    

    Die Main-.cpp enthält nur den Application::Run()-Aufruf der Instanz win von Form1.



  • Der Fehler scheint in der Dialog1.cpp zu stecken, da nach Löschung des Codes keine Fehlermeldung von der Typneudefinition kam. Aber ich finde den Fehler nicht. Meiner Meinung nach habe ich die Methoden korrekt deklariert



  • Hallo Taeli,

    du scheinst keine Include-Guards zu verwenden (#ifdef / #endif bzw. #pragma once).
    Der Header "Dialoh1.h" wird über "Form1.h" nochmals eingebunden.

    Und noch zu deinem Code (designtechnisch):
    Die statischen Member sind mehr als fragwürdig.
    Und eine Abhängigkeit von "Dialog1" zu "Form1" ist auch nicht gut.



  • Stimmt, mit #pragma once, und #pragma endregion lässt sich der Code auch kompilieren.

    Zu den statischen Elementen:

    Ich habe jetzt schon den Code umgebaut, und lasse die Dialog1-Instanz vom Konstruktor von Form1 erstellen, aber ich weiß nicht wie ich eine Instanz von Form1 in den cpp Dateien verwenden kann, ohne sie als statische Instanz in irgendeiner Klasse zu deklarieren.


Anmelden zum Antworten