[gelöst]Projekt mit mehreren Dateien erstellen?



  • Hiho 🙂

    Ich möchte aus diesem Code ein Projekt mit mehreren Dateien (1 x *.h, 2 x *.cpp) machen.

    #include <iostream.h>
    #include <conio.h>
    #include <stdio.h>
    
    //Part 1
    
    class flaeche
    {
    	private:
        		   float breite,laenge;
    
            public:
                       float a;
                       float b;
    
                       flaeche();
                       float area(float,float);
    
    };
    
    //Part 2
    
    flaeche :: flaeche()
    {
    		breite=a;
            laenge=b;
    }
    
    float flaeche :: area(float breite,float laenge)
    {
    	return (breite*laenge);
    }
    
    //Part 3
    
    void main(void)
    {
        flaeche f1;
    
        clrscr();
    
    	  cout<<endl<<"Bitte geben sie die Breite ein: ";
              cin>>f1.a;
    
              cout<<endl<<"Bitte geben sie die Laenge ein: ";
              cin>>f1.b;
    
              cout<<endl<<"Die Fl„che betr„gt: " <<f1.area(f1.a,f1.b);
              getchar();
    }
    

    Die *.h müsste den "Part 1", also die Klassendefinition, beinhalten.

    Eine *.cpp müsste den "Part 2", also die Klassendeklaration, beinhalten mit Verweis auf die *.h

    Und eine *.cpp müsste "Part 3", also die main, beinhalten.

    Wenn ich das Script wie oben in einer Datei compiliere funktioniert alles. Ich kann eine *.exe draus machen und in der cmd laufen lassen - funzt.

    Aber ich bekomme es einfach nicht hin den Code auf mehrere Projektdateien zu verteilen und die *.obj und daraus dann die *.exe zu erstellen. 😞

    Kann mir einer die Datei aufteilen damit ich einen Anhaltspunkt habe wie es aussehen sollte?


  • Administrator

    Ganz ehrlich, ich geb dir einen guten Rat, schmeiss das Buch oder Tutorial weg, welches du aktuell nutzt, denn es ist völlig veraltet, falsch und kann dir anscheinend nicht mal die Aufteilung von Header- und Implementationsdateien beibringen.

    <iostream.h> -> Kein C++ Standardheader
    <conio.h> -> Gibt es zwar, ist aber auch kein Standardheader
    <stdio.h> -> C Header, kein C++ Header

    void main(void) -> Ungültig in C und C++

    Kein namespace std vorhanden -> völlig veraltetes C++, mehr als 10 Jahren!

    Eine Aufteilung geht übrigens so:
    Header.hpp

    #ifndef MY_HEADER_GUARD__
    #define MY_HEADER_GUARD__
    
    class Foo
    {
    public:
      void bar() const;
    };
    
    #endif // MY_HEADER_GUARD__
    

    Impl.cpp

    #include "Header.hpp"
    
    #include <iostream>
    
    void Foo::bar() const
    {
      std::cout << "Foo::bar" << std::endl;
    }
    

    main.cpp

    #include "Header.hpp"
    
    int main()
    {
      Foo foo;
      foo.bar();
    
      return 0;
    }
    

    Empfohlene C++ Bücher:
    - C++ Primer
    - Thinking in C++ 1 & 2

    Empfohlene Compiler & IDE (beide gratis):
    - Code::Blocks
    - Microsoft Visual Studio Express Edition

    Grüssli



  • Compiler / IDE?

    Btw.: Dein Code ist alles andere als schönes C++.

    #include <iostream.h>
    #include <conio.h>
    #include <stdio.h>
    

    ➡ veraltet

    void main(void)
    

    ➡ war das jemals gescheites C++? 🙄
    main hat den Rückgabetyp int!



  • Dravere schrieb:

    Ganz ehrlich, ich geb dir einen guten Rat, schmeiss das Buch oder Tutorial weg, welches du aktuell nutzt, denn es ist völlig veraltet, falsch und kann dir anscheinend nicht mal die Aufteilung von Header- und Implementationsdateien beibringen.

    <iostream.h> -> Kein C++ Standardheader
    <conio.h> -> Gibt es zwar, ist aber auch kein Standardheader
    <stdio.h> -> C Header, kein C++ Header

    void main(void) -> Ungültig in C und C++

    Kein namespace std vorhanden -> völlig veraltetes C++, mehr als 10 Jahren!

    Ja. Da hast du völlig recht. Es ist ein compiler von 1992 und auf dem MUSS ich meine Prüfungen machen 😡

    Ich probier mal deine Beispiele aus, denn da seh ich ein paar Dinge die ich noch nicht probiert habe...bzw. die in meinem Unterrichtsmaterial nicht standen 😞

    Soweit erst mal danke 🙂



  • So. Ich hab jetzt diese drei Dateien erstellt

    Header:

    #ifndef wechsel_h__
    #define wechsel_h__
    
    class flaeche
    {
    	private:
        		   float breite,laenge;
    
              public:
                           float a;
                           float b;
    
                           flaeche();
                          float area(float,float);
    
    };
    #endif
    

    Deklaration:

    #include "wechsel.h"
    #include <iostream.h>
    
    flaeche :: flaeche()
    {
    	breite=a;
            laenge=b;
    }
    
    float flaeche :: area(float breite, float laenge)
    {
    	return (breite*laenge);
    }
    

    Main:

    #include <iostream.h>
    #include <conio.h>
    #include <stdio.h>
    #include "wechsel.h"
    
    //Part 3
    
    void main(void)
    {
        flaeche f1;
    
        clrscr();
    
    	cout<<endl<<"Bitte geben sie die Breite ein: ";
              cin>>f1.a;
    
              cout<<endl<<"Bitte geben sie die Laenge ein: ";
              cin>>f1.b;
    
             cout<<endl<<"Die Fl„che betr„gt: " <<f1.area(f1.a,f1.b);
             getchar();
    }
    

    Das compilieren schlägt fehl weil er behauptet dass die "Class flaeche" nicht existiert bzw. einen Deklaration syntax error in der Headerdatei sieht und deswegen in allen anderen Dateien nichts mit der Klasse anfangen kann...und dann entsprechende Fehlermeldungen ausgibt.

    Was stimmt an der Headerdatei nicht?



  • Ja. Da hast du völlig recht. Es ist ein compiler von 1992 und auf dem MUSS ich meine Prüfungen machen 😡

    Das soll wohl ein witz sein (Von deinem Lehrer xD)...

    @Thema
    versuch mal die cpp so zu machen:

    #ifndef wechsel_h__
    #define wechsel_h__
    
    class flaeche
    {
        private:
                   float breite,laenge;
    
              public:
                           float a;
                           float b;
    
                           flaeche();
                          float area(float breite ,float laenge);
    
    };
    #endif
    


  • Erklär mir bitte wie das funktionieren kann:

    class flaeche
    {
        public:
            float a;
            float b;
    
            flaeche();
    };
    
    flaeche :: flaeche()
    {
        breite=a;
        laenge=b;
    }
    

    Das was du eher willst ist wohl

    flaeche :: flaeche( float a, float b )
    {
        breite=a;
        laenge=b;
    }
    


  • Wohl eher umgekehrt..



  • drakon schrieb:

    Wohl eher umgekehrt..

    Nö. Er hat 2 private floats breite und laenge, und zwei public floats a uns b. Da wollte er jetzt im Konstruktor die beiden public floats den private floats zuweisen 😃



  • Hmm,ja, macht sinn. Wie soll sonst a nach breite kommen?

    Allerdings sagt er jetzt:

    "Typ qualifier 'flaeche' musst be a struct or class"



  • franz schrieb:

    drakon schrieb:

    Wohl eher umgekehrt..

    Nö. Er hat 2 private floats breite und laenge, und zwei public floats a uns b. Da wollte er jetzt im Konstruktor die beiden public floats den private floats zuweisen 😃

    Aso. Ich habe nur deinen Quellcode angeschaut.. Und da sollte es, wenn umgekehrt sein.. Also so:

    flaeche :: flaeche( float breite, float laenge )
    {
        a = breite;
        b = laenge;
    }
    

    @Andi S :
    Zeig doch bitte mal den Code, den du jetzt hast. Ich weiss nicht so genau, was du überhaupt machen willst..



  • So, ich hab das jetzt mal umgestellt.

    Header:

    #ifndef wechsel_h__
    #define wechsel_h__
    
    class flaeche
    {
    	private:
        		   float breite,laenge;
    
              public:
                           float a;
                           float b;
    
    		       flaeche();
                          float area(float,float);
    
    };
    
    #endif
    

    Deklaration:

    #include "wechsel.h"
    
    flaeche :: flaeche()
    {
    	breite=a;
            laenge=b;
    };
    
    float flaeche :: area(float breite, float laenge)
    {
    	return (breite*laenge);
    }
    

    main:

    #include <iostream.h>
    #include <conio.h>
    #include <stdio.h>
    #include "wechsel.h"
    
    //Part 3
    
    void main(void)
    {
        flaeche f1;
    
        clrscr();
    
    	cout<<endl<<"Bitte geben sie die Breite ein: ";
              cin>>f1.a;
    
              cout<<endl<<"Bitte geben sie die Laenge ein: ";
              cin>>f1.b;
    
             cout<<endl<<"Die Fl„che betr„gt: " <<f1.area(f1.a,f1.b);
             getchar();
    }
    

    Der Linker fängt auch an zu arbeiten, schafft es aber nicht ganz zur exe weil:

    Compiling Wechsel.cpp.
    Compiling Wechs.cpp.
    Linking 1.exe.
    Linker warning: No Modul definition files specified: using defaults.
    Linker error: _main defined in module Wechsel.cpp(das ist die mit der main drin) is duplicated in module Wechsel.cpp
    

    So wie es aussieht steht nur noch etwas "doppeltes" zwischen mir und der exe. Mal ganz abgesehen von irgendwelchen Definitionsdateien, was immer auch damit gemeint ist.

    Vorschläge?

    Edith:

    Ja, das Programm bringt als Ergebnis 0 raus weil flaeche() keine Parameter hat.



  • drakon schrieb:

    @Andi S :
    Zeig doch bitte mal den Code, den du jetzt hast. Ich weiss nicht so genau, was du überhaupt machen willst..

    Ich möchte einfach das script, welches ich im Anfangspost gepostet habe, auch drei dateien aufteilen. Zwecks Projekt, was ist eine Haederdatei, was ist eine Objektdatei ect.pp.

    Das Anfangsscript funktioniert in einer Datei geschrieben einwandfrei. Ich kann sogar hin gehen und bei "float area(float breite, float laenge)" ändern in "char area(float breite, float laenge)" und bekomme dann als Ausgabe die graphische Umsetzung des ASCII-Codes. Also wenn ich für a 7,001 eingebe und für b 14,001, dann kommt als Ausgabe "b" da ja 98,00irgendwas im ASCII-Code 98 ist und das ist nun mal der Buchstabe klein-b.

    Das heißt, es funktioniert alles. Nur wenn ich das Script auf Header, Deklaration und Main aufteilen will funzt nix mehr 😞



  • drakon schrieb:

    @Andi S :
    Zeig doch bitte mal den Code, den du jetzt hast. Ich weiss nicht so genau, was du überhaupt machen willst..

    So, nachdem ich den Fehler mit dem duplicated gefunden habe hier mein letzter noch offener Fehler:

    Er sagt mir dass ich in meiner Haederdatei in Zeile 4 einen

    "Declaration syntax error" habe

    Haederdatei:

    #ifndef wechsel2_h__
    #define wechsel2_h__
    
    class flaeche
    {
    	private:
        		   float breite,laenge;
    
              public:
                           float a;
                           float b;
    
    		       flaeche();
    
    		      float area(float, float);
    
    };
    
    #endif
    

    Deklarationsdatei wechs.cpp:

    #include "wechsel2.h"
    #include <iostream.h>
    
    flaeche :: flaeche()
    {
    	breite=a;
            laenge=b;
    }
    
    float flaeche :: area(float breite, float laenge)
    {
    	return (breite*laenge);
    }
    

    Und die main:

    #include "wechsel2.h"
    #include <iostream.h>
    #include <conio.h>
    #include <stdio.h>
    
    //Part 3
    
    void main(void)
    {
    
        flaeche f1;
    
        clrscr();
    
    	cout<<endl<<"Bitte geben sie die Breite ein: ";
              cin>>f1.a;
    
              cout<<endl<<"Bitte geben sie die Laenge ein: ";
              cin>>f1.b;
    
    	 cout<<endl<<"Die Fl„che betr„gt: " <<f1.area(f1.a,f1.b);
             getchar();
    
    }
    

    Wenn man das mit dem Script aus dem Eingangspost vergleicht sieht man dass an der Grundsyntax nichts verändert ist. Und das Eingangsscript hat in einer Datei gefunzt. Was also gibt es da jetzt an der Klassendeklaration in der Haederdatei rumzumotzen? Was ist da falsch?

    Edith:

    So, es ist mit der Hilfe von hier alles gelöst. Der letzte zu bekämpfende Fehler war, dass man die *h beim Borland 3.1 nicht mit in das Projekt nehmen kann sondern nur im selben Ordner plazieren muss. Danke für die mühen aller.

    Ergänzende informationen in den Nebenthreads

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-234809.html
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-234795.html



  • Dravere schrieb:

    <iostream.h> -> Kein C++ Standardheader

    http://www.cplusplus.com/reference/

    sondern?


  • Administrator

    kingcools2 schrieb:

    http://www.cplusplus.com/reference/

    sondern?

    Ich kenne diese Referenz sehr gut, sie steht in meiner Signatur :p
    Und schau es dir mal genau an. Es heisst <iostream> ohne ".h". Gilt für alle Standardheader von C++, sie enden nie mit einem ".h".

    Grüssli



  • jo hab ich dann auch entdeckt 😃 danke trotzdem


Anmelden zum Antworten