Wie fügt man eine header Datei ein und was steht drin?



  • @Neuling, ein paar Anmerkungen:

    1. Grundsätzlich war der Aufbau so wie du ihn hattest halbwegs in Ordnung, die Fehler dürften tatsächlich nur Syntaxdetails gewesen sein. Allerdings ist der getrennte Aufbau wie Cartman ihn vorgeschlagen hat besser, du kannst damit z.B. die Complex.cpp mit verschiedenen main()-Funktionen zusammenlinken und musst die Methoden nicht in jeder main.cpp neu definieren.
    2. da du nur auf öffentliche Methoden von Complex zugreifst braucht addition() kein friend der Klasse zu sein.
    3. Den Default-Konstruktor kannst du auch mit einer Initialisierungsliste versehen statt der Initialisierung/Zuweisung im Konstruktor-rumpf. Außerdem würde ich statt (1,1) eher (0,0) nehmen, da das konsistent mit den Defaultinitialisierungen der Standard-typen ist.
    4. Der nächste Schritt (kommt vermutlich demnächst beim Lernen) ist const-correctness: die Getter und die Printmethode verändern nichts am Objekt, daher kannst du sie als const deklarieren. Genauso die Parameter von addition(), die ja auch nicht verändert werden.
    5. Der übernächste Schritt nennt sich Operatorüberladung, ein Feature das es in Java nicht gibt. Damit kannst du aus deiner print()-Methode und der addition() Operatoren machen. Dein main()-Programm sähe dann so aus:
    #include <cstdlib>
    #include <iostream>
    #include "complex.h"
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    
        Complex a(2,3),b, c = a + b; //operator+ benutzt statt addition()
    
        cout << c << endl; //operator<< statt c.print()
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Die entsprechenden Schritte kommen aber sicher beizeiten in deinem Buch/Tutorial. Viel Spaß beim weiteren Lernen!

    Werbung in eigener Sache: wenn du soweit bist: es gibt einen Artikel über Operatorüberladung im Magazin 😉



  • Dravere schrieb:

    Eric Cartman schrieb:

    Tja, das ist nunma der Haken bei C++ - die (teilweise unnoetige) Kompliziertheit... Alles Gute hat eben einen Haken, so is das Leben 😃

    Was ist an Headern kompliziert? Ich empfinde die als einen enormen Vorteil gegenüber anderen Sprachen. Man kann dank den Headern schnell und einfach einen gewissen Überblick über die Klasse bekommen. In den Sprachen, wo die Deklaration und Definition nicht getrennt sind, hat man ohne IDE oder entsprechende Tools absolut keine Chance, irgendwie einen Überblick zu bekommen.

    Ich schaue nur in die Headers, wenn es keine vernünftige API-Doku gibt. Das ist dann eher peinlich und das ist NICHT Sinn der Headers! 😡



  • Neuling09-1 schrieb:

    Ich danke dir!! 🙂
    Habe es geändert und es funktioniert.

    Warum überhaupt so kompliziert? - Komme ursprünglich aus Java und da ist alles ein bisschen einfacher...

    Ja, aber dafür kann Java keine Value-Objekte! Oder kann ich in Java Objekte auf dem Stack anlegen? Nein, kann ich nicht!
    Der Compiler braucht aber die Headers, weil dort die Infos drin stehen, wie er die Value-Objekte erstellen kann.

    Du braucht aber bei C++ keine Header, wenn du wie in Java ein referenziertes Objekt hast:

    std::string *str; // kein Header nötig, da wie in Java das Objekt nur referenziert wird
    std::string str; // Header nötig, da statisches Objekt auf dem Stack angelegt. Bei Java nicht möglich
    

    Es hat also technische Gründe, warum man Header benötigt.



  • Da sowieso gleich jemand angedackelt kommt. Korrigier ich das mal:

    class string; // Forward declaration reicht für referenzed Objekte:
    string *str; // kein Header nötig, da wie in Java das Objekt nur referenziert wird
    
    string str; // Header nötig, da statisches Objekt auf dem Stack angelegt. Bei Java nicht möglich,
    // forward declaration reicht nicht aus!
    

    Ja, ich weiß das es bei std::string mit der forward-declaration wegen dem typedef nicht geht. Also stellt euch ein nicht-typedefed string vor. 😉


  • Administrator

    Bulli schrieb:

    Ich schaue nur in die Headers, wenn es keine vernünftige API-Doku gibt. Das ist dann eher peinlich und das ist NICHT Sinn der Headers! 😡

    Und wieso gleich so wütend??? Darf man denn heutzutage nicht mal mehr eine Meinung haben, welche jemand anderes nicht hat? Zudem habe ich nicht gesagt, dass dies der Sinn der Header ist. Herje.

    Ich bin auch glücklich über eine Dokumentation und ziehe diese einem Header auch vor. Aber gerade im eigenen Code oder in der Entwicklung des Codes, wo oft noch keine Dokumentation zu diesem Code vorhanden ist, ist es extrem praktisch einen Header zu haben. Es dient auch dem eigenen Überblick.

    Wenn du im übrigen gerade so pingelig bist:

    Bulli schrieb:

    ... Du braucht aber bei C++ keine Header, wenn du wie in Java ein referenziertes Objekt hast ...

    Das ist auch nicht ganz richtig. Du brauchst keinen Header um die Referenz oder den Zeiger zu erstellen, da man technisch dazu die Grösse des Objektes nicht benötigt. Sobald man allerdings über die Referenz oder den Zeiger auf das Objekt zugreifen möchte, braucht man die genauen Informationen über das Objekt, also den Header.

    Grüssli



  • Dravere schrieb:

    Bulli schrieb:

    Ich schaue nur in die Headers, wenn es keine vernünftige API-Doku gibt. Das ist dann eher peinlich und das ist NICHT Sinn der Headers! 😡

    Und wieso gleich so wütend??? Darf man denn heutzutage nicht mal mehr eine Meinung haben, welche jemand anderes nicht hat? Zudem habe ich nicht gesagt, dass dies der Sinn der Header ist. Herje.

    Der Smily war gegen die fehlenden Dokus gerichtet!!! Nicht gegen dich.



  • Hat zwar nicht viel mit dem ursprünglichen Problem zu tun, aber in der Standardbibliothek gibt es bereits einen Header <complex> für komplexe Zahlen. Man sollte deshalb auch ein wenig vorsichtig mit Bezeichnern, Makros und Dateinamen sein...


  • Administrator

    Bulli schrieb:

    Der Smily war gegen die fehlenden Dokus gerichtet!!! Nicht gegen dich.

    Oh, sorry 🙂
    Dann versteh ich das Smily und stimme dieser Stimmung voll und ganz zu 😃

    Grüssli



  • Bulli schrieb:

    Ich schaue nur in die Headers, wenn es keine vernünftige API-Doku gibt. Das ist dann eher peinlich und das ist NICHT Sinn der Headers! 😡

    Also in 90% der Projekte an denen ich gearbeitet habe war die Dokumentation eher minimal - wenn überhaupt vorhanden. Und in der Regel war 90% der dann noch vorhandenen Sourcecodedokumentation die, die ich dem Projekt hinzugefügt habe.

    Der Sinn eines Headers ist auch nicht die Dokumentation (es sei den man arbeitet mit Tools wie doxygen, dann vielleicht auch das), aber sie ist die Übersicht der öffentlichen Schnittstelle. Implementierungsdetails verleiten an dieser Stelle nur dazu, gegen die Implementierung zu Programmieren.

    cu André



  • asc schrieb:

    Also in 90% der Projekte an denen ich gearbeitet habe war die Dokumentation eher minimal - wenn überhaupt vorhanden.

    Oh, wie bekannt mir das vorkommt! Und zwar eher das "wenn überhaupt vorhanden", weniger das "minimal"... 😉



  • _matze schrieb:

    Oh, wie bekannt mir das vorkommt! Und zwar eher das "wenn überhaupt vorhanden", weniger das "minimal"... 😉

    Interessant in der Hinsicht ist auch, das ich eher als langsamer Programmierer gelte, und dabei auch mit einem Projektleiter aneinander geraten bin. Ein halbes Jahr später, ich war bereits in einen anderen Projekt, bekam ich eine Gehaltserhöhung - mit den Hinweis das ich vor allem vom erstgenannten gelobt worden bin.

    Was war passiert? Nach etwas Nachforschen: Nun der Projektleiter musste irgendwann das Projekt im ganzen übernehmen, und der einzige der Zeit für Dokumentation und zumindest maginaler Codepflege "verschwendet" hatte, war Ich.

    Wie sich Meinungen zu der Geschwindigkeit doch ändern können...

    cu André
    P.S: Auch wenn ich selbst eher viel Dokumentiere, ist mir persönlich die Trennung Header/Source ganz recht. Für einen Überblick finde ich den Header Ideal.


Anmelden zum Antworten