Header einbinden



  • _matze schrieb:

    Vielleicht ein doppelt notierter Prototyp oder sowas?

    Nein...

    Selbst eine banale Header...

    int _mal(int _zahl1, int _zahl2)
    {
        return _zahl1 * _zahl2;
    }
    

    Lässt sich bei mir nicht in zwei Formulare einbinden.
    Habe sie versuch in der "stdafx.h" mit einzubinden.
    Fehlermeldung...

    1>Form2.obj : error LNK2005: "int __clrcall _mal(int,int)" (?_mal@@$$FYMHHH@Z) ist bereits in stdafx.obj definiert.

    1>C:\Users\Sander\Desktop\Dells\Debug\Dells.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.

    Sobald ich mit..

    this->Text::set(_mal(23,23).ToString());
    

    auf die Funktion zugreifen will...

    Muss ich noch in meiner C++ 2005 EE was einstellen.
    Linker oder sowas?
    Ich hab kein schimmer. 😮

    Brauche Hilfe, bin am Ende....
    Hilfe, hilfe!!!!

    Gruß



  • Also irgendwo muss da doch eine doppelte Version rumschwirren, oder sehe ich das falsch? Dein Linker denkt sich das ja nicht aus. 😉 Nutze vielleicht mal die Suchfunktion (ganze Projektmappe) und suche nach "_open(" oder so.



  • Hab ich schon gemacht.
    Glaub mir.
    Kannst das ja mal selber Testen!?
    Bei mir haut das nicht hin :xmas2:



  • Keiner ein Vorschlag?



  • Hab das gleiche Problem.
    Hast Du schon eine Lösung gefunden Sander?
    Es ist nicht möglich eine Header in zwei Formen einzubinden.
    Kann mir jemand helfen?

    Gruß



  • Seit wann implementiert man *Funktionen* in einem Header? Mach die Deklaration in dem Header und implementiere sie in einer CPP-Datei.



  • Habe jetzt die Funktionen in eine Klasse gepackt, nun funzt es.
    Ich weiß aber nicht, ob das so gemacht wird!?
    Das Einbinden der cpp Datei hat die gleiche Fehlermeldung gebracht.

    Meine test.h

    #pragma once
    
    using namespace System;
    using namespace System::Windows::Forms;
    using namespace System::Drawing;
    
    using namespace testBeispiel;
    
    	ref class Dialoge
    	{
    
    	public:
    		static String^ _open(String^ _Title,String^ _Filter)
    		{
    			OpenFileDialog^ _openDialog = gcnew OpenFileDialog();
    			_openDialog->Title::set(_Title);
    			_openDialog->Filter::set(_Filter);
    			_openDialog->ShowDialog();
    
    			return _openDialog->FileName;
    		}
    
    		static String^ _save(String^ _Titel, String^ _Filter)
    		{
    			SaveFileDialog^ _saveFile = gcnew SaveFileDialog();
    			_saveFile->Title::set(_Titel);
    			_saveFile->Filter::set(_Filter);
    			_saveFile->ShowDialog();
    
    			return _saveFile->FileName;
    		}
    
    		static Color _color(Color _setColor, bool _full)
    		{
    			ColorDialog^ _colorDialog = gcnew ColorDialog();
    			_colorDialog->FullOpen::set(_full);
    			_colorDialog->Color::set(_setColor);
    			_colorDialog->ShowDialog();
    
    			return _colorDialog->Color;
    		}
    
    		static Font^ _font(Font^ _FontGet, bool _FontMustExist, bool _ShowColor, int _MinSize, int _MaxSize)
    		{
    			 FontDialog^ _fontDialog = gcnew FontDialog();
    			 _fontDialog->Font::set(_FontGet);
    			 _fontDialog->FontMustExist::set(_FontMustExist);
    			 _fontDialog->ShowColor::set(_ShowColor);
    			 _fontDialog->MinSize::set(_MinSize);
    			 _fontDialog->MaxSize::set(_MaxSize);
    			 _fontDialog->ShowDialog();
    
    			 return _fontDialog->Font;
    
    		}		
    	};
    


  • Mehren schrieb:

    Das Einbinden der cpp Datei hat die gleiche Fehlermeldung gebracht.

    Meinst du einbinden per #include? Man inkludiert keine cpp-Dateien! Du packst deine Klassendefinitionen und Prototypen in einen Header, die eigentliche Implementation geschieht dann aber in einer cpp-Datei. Die fügst du deinem Projekt hinzu (so dass die Implementation nur einmal kompiliert wird), und überall wo du deine Klassen/Funktionen aus dieser cpp-Datei benutzen willst, inkludierst du den Header.



  • Hallo _matze,

    danke für die Antwort, aber das verstehe ich nicht so ganz.

    Ich lege zum Beispiel eine test.h und eine test.cpp an.
    Die test.h sieht so aus...

    #pragma once
    
    using namespace System;
    using namespace System::Windows::Forms;
    using namespace System::Drawing;
    
    using namespace testBeispiel;
    

    Und der Rest kommt in die cpp?

    using namespace testBeispiel;
    
        ref class Dialoge
        {
    
        public:
    
            static Color _color(Color _setColor, bool _full)
            {
                ColorDialog^ _colorDialog = gcnew ColorDialog();
                _colorDialog->FullOpen::set(_full);
                _colorDialog->Color::set(_setColor);
                _colorDialog->ShowDialog();
    
                return _colorDialog->Color;
            }
    
            static Font^ _font(Font^ _FontGet, bool _FontMustExist, bool _ShowColor, int _MinSize, int _MaxSize)
            {
                 FontDialog^ _fontDialog = gcnew FontDialog();
                 _fontDialog->Font::set(_FontGet);
                 _fontDialog->FontMustExist::set(_FontMustExist);
                 _fontDialog->ShowColor::set(_ShowColor);
                 _fontDialog->MinSize::set(_MinSize);
                 _fontDialog->MaxSize::set(_MaxSize);
                 _fontDialog->ShowDialog();
    
                 return _fontDialog->Font;
    
            }        
        };
    

    Richtig?

    Aber wie mache ich die cpp in der Header bekannt, damit beide auch eingebunden werden?

    Gruß



  • Ist noch nicht ganz richtig:

    In die Header Datei gehört noch die Klassendefinition und Protytpen der Methoden.

    für den Besipsiel sähe die Headerdatei folgendermaßen aus:

    #pragma once
    
    using namespace System;
    using namespace System::Windows::Forms;
    using namespace System::Drawing;
    
    namespace testBeispiel {
        ref class Dialoge {
            public:
                static Color _color(Color _setColor, bool _full);
                static Font^ _font(Font^ _FontGet, bool _FontMustExist, bool _ShowColor, int _MinSize, int _MaxSize)
        };
    }
    

    In deiner Quelltext-Datei inkludierst du dann noch diese Header-Datei.

    Mehern schrieb:

    Aber wie mache ich die cpp in der Header bekannt, damit beide auch eingebunden werden?

    Gar nicht Quelltextdateien werden NIE irgendwo inkludiert.

    Das zusammensuchen der Klassendefinitionen und Prototypen macht der Linker von ganz alleine.
    Du musst nur in den Quelltextdateien wo du die definierten Klassen / Methoden nutzen willst die entsprechende Header-Datei inkludieren.

    MfG
    Marco



  • Danke Marco es funzt.

    Aber was ist jetzt der Vorteil?
    Warum macht man das so?

    Musste den Code noch etwas angleichen...

    Mit...

    namespace Name {
    }
    

    hatte ich über 213 Fehler gehabt.

    Mit...

    using namespace Name;
    

    ...geht's



  • Man macht sowas um z.B. Klassen nach Themen sortiert in unterschiedliche Dateien zu packen.

    So kann man z.B. eine Quelltextdatei nehmen um eine Benutzeroberfläche zu erzeugen, und eine andere um auf Aktivitäten des Benutzers zu reagieren.

    Würde man sowas nicht machen, bekänme man sehr lange Quelltextdateien. Sowas ist dann ziemlich unübersichtlich wenn etwas bestimmtes gesucht wird.

    MfG
    Marco



  • Danke für die Antwort und die Hilfe.
    Das leuchtet sogar mir ein lol 🙂

    thx

    🙂


Anmelden zum Antworten