C++ Files Project Structure + IoC



  • Guten Morgen Leute,

    ich bin gerade dabei ein neues Projekt in C++ aufzusetzen, und tu mir schon schwer eine "sinnvolle" Datei -Struktur
    zu verwenden, nah bissel lesen is klar, dass Header files und cpp files getrennt sein sollten (so we es schon bei nem VS Projekt ersichtlich ist).

    Ich komm aus der C# Welt, da spiegelt die Datei/Ordern Struktur auch die Namespace etc. wieder, und ja habe da keine Headers..

    In C++ wird müsste ich ja jetzt für die Header und Cpp jeweils die selbe File Struktur anlegen , und in VS Projekte gibt es ja keine "Ordner" sondern "Filter", welche unterschiedliche Semantik haben.

    Ok, nicht desto trotz , wie macht Ihr das? welche File struktur Philosophie verfolgt Ihr!?

    Und wenn ich schon dabei bin:) Ich würde auch IoC Dependecy Injection wie ich es gern in C# (bsüw. Autofac) mache auch in C++ verwenden, aber auch in C++ gibt wird ehr die "policy based template" konzept verwendet als Grundlage zur IoC.. wie macht ihr das?

    Vielen Dank schonmal fürs lesen:)



  • Guten Morgen @SoIntMan,
    zu der Frage "Datei-Struktur":
    Helper-Klassen etc. habe ich in einem eigenen Toolverzeichnis. Alles was eine logische Einheit ist, wie z.B. Wiederverwendbares (Bibliotheken wie Libs oder DLLs) oder Projekte kommen jeweils in ein eigenes Verzeichnis. Ich versuche alles Wiederverwendbares unabhängig zu gestalten (z.B. arbeiten mit abstrakten Klassen).

    Die Filterstruktur in VS-Projekten gestalte ich ggf. nach einer anderen Logik. Wenn ich z.B. mit Qt arbeite, kommen z.B. die vom Meta-Object Compiler (moc) zu verarbeitende Header in einen eigenen Filter (verknüpft mit moc). Auch andere, nicht von VS verarbeitbare Dateien (wie z.B. Qt-Dialogdatein (ui) habe ich in VS in einem Filter und mit dem Qt-Designer verknüpft)
    Bei mir sind die Filter von VS nicht ganz so funny, es verschwinden ab und an die Qt-Header aus dem angelegten Filter in den von VS vorgegebenen Header-Filter.

    Zu "IoC Dependecy Injection" habe ich folgende Diskussion gelesen:
    https://www.quora.com/Is-dependency-injection-commonly-used-in-C



  • Bzgl. Dateistruktur kommt es auf den Projekttyp an. Bei Library-Projekten sollten die (öffentlichen) Header in ein eigenes Verzeichnis ("includes") gepackt werden, damit diese dann zusammen mit der ".lib" (und evtl. ".dll") ausgeliefert werden können.
    Bei Anwendungen (bzw. nur intern benutzten Projekten) braucht man sich nicht unbedingt daran zu halten und könnte auch Source- und Headerdateien zusammen in einen Ordner packen (ich würde es jedoch nicht so empfehlen, auch wenn ich selber viele UI-Projekte [besonders noch C++ Builder Projekte] so aufgebaut habe).
    In VS müssen technisch zwar nur die Sourcedateien dem Projekt hinzugefügt werden, zur besseren Navigation können aber auch die Headerdateien aufgenommen werden (VS erkennt selber anhand der Endung, daß diese nicht explizit kompiliert werden sollen). In Firmen werden häufig noch [kostenpflichtige] VS-Erweiterung, wie z.B. Visual Assist, zusätzlich benutzt.

    Da man (fast immer) nur einen Hauptnamensbereich (namespace) für das eigene Projekt verwendet, sind dann Unternamensbereiche entsprechend in eigenen gleichbenannten Unterordnern.

    Dependency Injection sollte man (selbstverständlich) auch in C++ verwenden, um die Abhängigkeiten zu minimieren, jedoch gibt es standardmäßig keine DI-Container (da in C++ keine Reflection möglich ist).
    Eine Umsetzung dazu habe ich jedoch in Write Your Own Dependency-Injection Container gefunden. Und z.B. in Dependency Injection in C++ (von C# nach C++) sowie A Functional Alternative to Dependency Injection in C++ sind explizite Umsetzungen erklärt.



  • Danke für die Inspiration hinsichtlich Dateistruktur, dann mach ich das so mit getrennten headern.. vll verwendet eich ehr namespaces statt viele tiefe sub-folder hierarchieren..

    @Th69 sagte in C++ Files Project Structure + IoC:

    Dependency Injection sollte man (selbstverständlich) auch in C++ verwenden, um die Abhängigkeiten zu minimieren, jedoch gibt es standardmäßig keine DI-Container (da in C++ keine Reflection möglich ist).
    Eine Umsetzung dazu habe ich jedoch in Write Your Own Dependency-Injection Container gefunden. Und z.B. in Dependency Injection in C++ (von C# nach C++) sowie A Functional Alternative to Dependency Injection in C++ sind explizite Umsetzungen erklärt.

    Habe es mir mal angeschaut, wenn man in C++ nich so tief drin ist, is alles echt sehr kryptisch;:) das heisst so C-tor args auflösen ohne reflection muss ich dann von hand zusammensetzen !?



  • Ja, der Code dafür muß in C++ explizit erstellt werden (evtl. bieten sich dafür dann aber Templates [mit Parameter Packs] oder ein Code-Generator an, wenn man sehr viele Interface-Parameter hat).



  • @Th69 sagte in C++ Files Project Structure + IoC:

    Ja, der Code dafür muß in C++ explizit erstellt werden (evtl. bieten sich dafür dann aber Templates [mit Parameter Packs] oder ein Code-Generator an, wenn man sehr viele Interface-Parameter hat).

    ich hab was cooles gefunden

    https://github.com/stevef51/CPPServiceLocator

    das gefällt mir 😉


Anmelden zum Antworten