Forum: PC-Programmierung Wie C++ Projekt organisieren?


von Michl (Gast)


Lesenswert?

Mahlzeit,

mich würde mal interessieren wie ihr in objektorientierten Sprachen, 
allen vorran C++, eure Sourcen organisiert.

Ich komme aus der Embedded-Ecke, und dort eher C als C++. Da hat sich im 
beruflichen Umfeld (und dadurch auch daheim) eingebürgert, jedes Modul 
bekommt einen Ordner myModul, darinnen findet sich eine myModul.h und 
myModul.c. Evtl noch zusätzliche Dateien, die Konfigurationen enthalten.

Ich habe bei meiner Arbeit mit C++ versucht, dieses Schema 
beizubehalten. Also eine .cpp und eine .h für jede Klasse. Java verlangt 
dies imho sogar explizit, dass eine Klasse so heißt wie die dazugehörige 
Datei.

Da stellt sich aber sehr schnell heraus dass man mit dem Ansatz nicht 
weit kommt. In einen C++ Projekt finden sich viel mehr Klassen als 
"Module" in einem C Projekt. Also hab ich eher geschaut dass ich nur die 
Klasse im Header bekannt mach die nach außen sichtbar sein soll, 
Hilfsklassen kommen ins .cpp File. Da stören mich schonmal die nötigen 
Vorward-Declarations die nötig sind um die Header sauber zu halten.

Aber es geht weiter: werden Hilfsklassen zu groß bietet es sich an, sie 
dennoch auszulagern und ihnen extra Dateien zu spendieren. Aber man will 
ja nicht alles in einem Ordner haben, weswegen ich dann solche 
Strukturen geschaffen habe:
projectroot/myClass/myHelperClass, worinnen dann die Dateien der 
Hilfsklasse liegen.

Was aber wenn ich eine mySecondClass habe, die ebenso im projectroot 
liegt, die myHelperClass benutzen will? Dann muss ich meine 
Ordnerstruktur ändern:
projectroot/myClass
projectroot/mySecondClass
projectroot/myHelperClass

Jetzt liegt aber myHelperClass leveltechnisch gesehn viel zu weit 
"oben", denn sie sollte eigentlich nicht direkt benutzt werden.

Lange Rede, kurzer Sinn: ich hab keinen Plan wie ich mein C++ Projekt 
organisieren soll. Ich weiß nicht, was ich in die Header packen soll und 
ich weiß nicht wie ich die Klassenhierachie in der Ordnerstruktur 
abbilden kann.

Könnt ihr mir da generelle Tipps geben?
Oder gibt es da vielleicht eine Übersicht über bewährte Techniken?
(auf uC.net gibts ja zumindest einen Wiki Artikel was C Sourcen und 
Header betrifft, sowas in der Richtung).
Und wie gesagt, eine sinnvolle Ordnerstruktur würde mich auch 
interessieren.

Grüße!

von Oliver (Gast)


Lesenswert?

Michl schrieb:
>  Also eine .cpp und eine .h für jede Klasse.

Genau so. Ganz selten anders. Allerdings nicht jeder Klasse nochmals in 
einen eigenen Ordner, sondern Ordner nach Modulen/libs/sonstigen 
Einheiten.

Oliver

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Beachte weiterhin, dass es innerhalb der Quelltexte auch noch die 
Namespaces als hirarchische Ordnungseinheit gibt. Diese lassen sich auch 
dafür einsetzen, entsprechende Modulhirarchien abzubilden. Ob man nun 
versuchen sollte, Verzeichnis- und Namespace-Hirarchie aufeinander 
abzubilden, kann sicherlich auch länglich diskutiert werden.

Ich handhabe es üblicherweise auch so, dass kleinere Hilfsklassen nicht 
in separate Dateien ausgelagert werden. Sobald jedoch die Funktionalität 
von mehreren Modulen genutzt werden, werden die Hilfsklassen ausgelagert 
und ggf. Namespaces angepasst.

von A. H. (ah8)


Lesenswert?

Oliver schrieb:
> Michl schrieb:
>>  Also eine .cpp und eine .h für jede Klasse.
>
> Genau so. Ganz selten anders. Allerdings nicht jeder Klasse nochmals in
> einen eigenen Ordner, sondern Ordner nach Modulen/libs/sonstigen
> Einheiten.
>
> Oliver

Ich würde eher formulieren: trenne das, was getrennt verwendet werden 
kann und halte das zusammen, was zusammen verwendet werden muss. Nach 
meiner Erfahrung ist es dann eher selten, dass eine Klasse in einer 
Datei alleine bleibt. Es macht zum Beispiel wenig Sinn, einen 
STL-konformen Container zu schreiben und die spezifischen Iteratoren in 
eigene Dateien auszulagern, nur um einer Regel zu genügen. (Es sei denn, 
ich kann die gleichen Iteratoren für mehrere Container nutzen, dann 
gehen sie zwecks Nachnutzung natürlich in eine eigen Datei, 
wahrscheinlich reicht dann aber auch eine für alle.) Also, grundsätzlich 
ist die Richtlinie gut, nimm sie aber nicht zu wörtlich. Es ist eben nur 
eine Richtlinie.

von Doc (Gast)


Lesenswert?

/[projectname]
 -- /src         (.cpp, .c)
 -- /inc         (.h)
 -- /lib         (.dll, .o, .so, eigene libs)
 -- /bin         ( kompiliertes, command line tools)
 -- /data        ( assets, ... )
 -- ...

wobei src und inc würde ich noch unterteilen wie oben steht nach dem 
sinn, je nachdem was du für ein projekt machst

/helpers, /utils, /models, /views, /interface, /gui, ...

von Mark 99 (Gast)


Lesenswert?

Wenn du es ganz genau wissen willst (abzüglich ein paar veralteter 
Ideen):

Lakos: Large-Scale C++ Software Design
http://www.amazon.com/Large-Scale-Software-Design-John-Lakos/dp/0201633620

von Doc (Gast)


Lesenswert?

Mark 99 schrieb:
> Wenn du es ganz genau wissen willst (abzüglich ein paar veralteter
> Ideen):
>
> Lakos: Large-Scale C++ Software Design
> http://www.amazon.com/Large-Scale-Software-Design-John-Lakos/dp/0201633620

Das Buch ist von 1996... damals hat man Software noch auf Papierkarten 
geschnitzelt
Geh mal lieber auf GitHub und stöbere da durch grössere Projekte, da 
siehst du die Strukturen die sich etabliert haben heutzutage. Wobei es 
nicht zwingend notwendig ist, ... je nach Projekt ist die sinnvolle 
Struktur anders und das kommt erst mit der Erfahrung.

von Alexander S. (alesi)


Lesenswert?

Michl schrieb:
> Könnt ihr mir da generelle Tipps geben?
> Oder gibt es da vielleicht eine Übersicht über bewährte Techniken?

Einige Infos gibt es z.B. hier:

Bjarne Stroustrup's C++ Style and Technique FAQ
http://www.stroustrup.com/bs_faq2.html

Look at the JSF air vehicle C++ coding standards.
http://www.stroustrup.com/JSF-AV-rules.pdf

von Mark 99 (Gast)


Lesenswert?

Doc schrieb:
> Das Buch ist von 1996...

Und?

> damals hat man Software noch auf Papierkarten
> geschnitzelt

Geht's noch?


Immer diese dauerbekifften Kids, die alles älter als ein Jahr schon als 
"classic" bezeichnen und alles älter als fünf Jahre für Dreck halten.

von Doc (Gast)


Lesenswert?

Mark 99 schrieb:
> Geht's noch?
>
> Immer diese dauerbekifften Kids, die alles älter als ein Jahr schon als
> "classic" bezeichnen und alles älter als fünf Jahre für Dreck halten.

Hallo Mark,

wer hier bekifft und ein Kid ist, ist noch die Frage.
Da direkt mit Beleidigungen anfangen zeugt nicht von deiner erwachsenen 
nüchternen Seite.

Seit 1996 sind keine 5 Jahre, sondern 18 Jahre vergangen, und damals 
waren andere C/C++ Standards, die wiederrum auswirkungen auf sinnvolle 
Projektstrukturen hatten. Der Threadersteller kann sicher noch von dir 
vorgeschlagenes Buch lesen, nur "sinnvoller" wäre natürlich auf die 
heutige Technik zu schauen.

Gruß

von Karl H. (kbuchegg)


Lesenswert?

Doc schrieb:

> Seit 1996 sind keine 5 Jahre, sondern 18 Jahre vergangen, und damals
> waren andere C/C++ Standards, die wiederrum auswirkungen auf sinnvolle
> Projektstrukturen hatten.

Aber sie sind nicht so groß, dass zentrale Themen damit ungültig würden.

Fred Brooks 'Mythical Man Month' stammt aus 1975. Trotzdem werden auch 
heute noch genau die gleichen Fehler gemacht, die damals schon 
gebrandmarkt wurden.

http://en.wikipedia.org/wiki/The_Mythical_Man-Month

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.