Übersichtlich Programmieren



  • Abend

    Wahrscheninlich wurde das Thema schon mehrmals angeschnitten.

    Macht es Sinn mehrere .cpp in einem Projekt zu verwenden?

    Ich würde gerne einige Hilfsfunktionen in andere .cpp verschieben und sie dann im main.cpp laden und verwenden.

    Somit könnte ich in der main.cpp mehr Übersicht gewinnen. Ihr seid erfahrene Programmierer und ich würde mich über Tipps und Tricks zum Thema Übersichtlichkeit freuen.

    Gruss

    //Edit Noch was, da man in den anderen .cpp auch #includes machen muss hat es von der Performance sicher auch Nachteile?



  • Eine .cpp Datei - eine Aufgabe.
    Das ist wie mit Klassen: eine Klasse - eine Aufgabe.



  • Wir lernen momentan in der Schule c++.

    Leider auf einem völlig veraltetem Compiler (Borland 5) und immer nur mit einer .cpp.

    Weil ich das besser machen möchte habe ich mir MS Visual Studio geholt und bin fleissig am probieren und lernen. Nächste Woche kommt mein C++ Primer Buch 🙂

    Eine .cpp eine Aufgabe?

    Ich habe hier zum Beispiel eine Aufgabe mit einem Menü, man muss Datensätze hinzufügen, Datensätze löschen, etc.... Wenn ich das richtig verstehe würdest du für jede Aufgabe eine eigene .cpp benutzen? Ist das nicht schlecht wenn man am Ende 8 .cpp hat? 😕



  • das kannst du im etwas weiteren sinne sehen.
    hier: eine cpp -> aufgabe: verwaltung v. menue/datensaetzen (ggf. cpp- + h-file f. eine klasse)
    eine weitere cpp: main.cpp, wo main-loop usw. gemanaged wird

    mfg,
    julian



  • Ja das mit den Klassen hab ich so gemacht.

    Also ist es ein Fehler wenn ich eine Funktion in eine andere .cpp schiebe und sie dann in meiner main.cpp verwende?

    Gruss



  • Typhoon schrieb:

    Also ist es ein Fehler wenn ich eine Funktion in eine andere .cpp schiebe und sie dann in meiner main.cpp verwende?

    rein formal nicht, nein.
    ob es auch sinnvoll ist, ist so pauschal schwer zu sagen.

    mfg,
    julian



  • Typhoon schrieb:

    Also ist es ein Fehler wenn ich eine Funktion in eine andere .cpp schiebe und sie dann in meiner main.cpp verwende?

    Du solltest sie in einem Header deklarieren, und diesen Header in die main.cpp einbinden, sodass sie dort bekannt ist.

    Wieso ist das Forum eigentlich gerade so langsam?



  • Ein Fehler wäre es nicht, es bietet sich eben nur bei größeren Projekten an, zusammengehörende Klassen und Funktionen in die gleiche .h und .cpp Kombination zu tun und Klassen und Funktionen, die nichts damit zu tun haben, davon zu trennen. Man kann auch jede Klasse von den anderen trennen, das ist aber Geschmackssache. Ich bevorzuge es, wenn es in einer Datei zu finden ist, sofern es zusammengehört und solange die Klassen nicht zu groß werden. Aber das ist wie gesagt jedem selber überlassen, wie er das gut findet.

    MfG



  • //Edit Noch was, da man in den anderen .cpp auch #includes machen muss hat es von der Performance sicher auch Nachteile?

    Bei der Ausführung des Programms brauchst du keine Nachteile erwarten. Ggf. dauert das Übersetzen etwas länger.

    Die Header-Dateien dienen dem Compiler dazu, um zu wissen, WIE die Funktionen/Klassen/Methoden aussehen: Welchen Rückgabetyp sie haben, welche Parameter erwartet werden etc. Aus der Quelldatei (.cpp) wird eine Objektdatei erzeugt. Gut erkennen kann man das, wenn man "von Hand" übersetzt (z.B. mit dem GCC).

    Gegeben seien drei Dateien:

    // main.cpp
    #include "hello.hpp"
    int main()
        {
            cppde::hello();
        }
    
    // hello.hpp
    #if !defined(CPPDE_HELLO_HPP__INCLUDED)
    #define CPPDE_HELLO_HPP__INCLUDED
    // Der so genannte Include-Guard verhindert, dass diese Dateien mehrfach
    //  eingebunden werden können
    
    // In Headerdateien NIEMALS using namespace verwenden
    
    namespace cppde {
    void hello();
      // Diese Funktion gibt ein "Hello World" über cout aus.
    }
    #endif
    
    // hello.cpp
    #include "hello.hpp"
    #include <iostream> // Wird erst hier eingebunden, da es eine "Implementierungs-
      //  detail" ist.
    
    void cppde::hello()
        {
            std::cout << "Hello World" << std::endl;
        }
    

    "Von Hand" übersetzt gingest du nun folgendermaßen vor:

    1. übersetze/kompiliere hello.cpp -> Erzeugt eine Objektdatei hello.o
    2. übersetze/kompiliere main.cpp -> Erzeugt eine Objekdatei main.o
    3. verbinde/linke main.o mit hello.o und erzeuge das Programm HalloWelt
       -> Erzeugt ausführbare Datei HalloWelt
    
    Richtig angewendet sähe das so aus:
    > g++ -c hello.cpp
    > g++ -o HalloWelt main.cpp hello.o
    Schritt 2 und 3 wurden hier zusammengefasst.
    
    Da du eine IDE verwendest, sind diese Schritte für dich ohnehin nicht mehr sichtbar.
    

    Die Funktionalitäten (Objektcode) aus <iostream> oder <string> werden auch erst im letzten Schritt (Linking) einmalig hinzugefügt. Es spielt also für dein fertiges Programm keine Rolle, ob du <iostream> nur einmal oder 100 mal in dein Projekt inkludierst.

    Existiert die Objektdatei, welche auch in einer Bibliothek vorhanden sein kann, nicht, so entstehen die allseits geliebten undefined reference-Fehlermeldungen.

    Grüße... Heiko


Anmelden zum Antworten