Projekte mit mehreren Klassen, wohin mit den #includes?
-
Hi,
ich hab mal eine leichte Frage für euch.
Ich möchte n kleinen Ray Tracer basteln mit dem C++ Builder und brauche dazu diverse Klassen. Nur habe ich gestern schon an der einfachsten Funktion Minuten lang gesessen da ich bei C++ immer nicht so recht weiß, wie ich wo, was am besten einbinde.Folgende Situation:
Klasse Vector3 ist in einer separaten Datei (Vector3.cpp + Vector3.h).
Ich möchte in Vector3 alles einbinden, was in meiner main.cpp (Button-Aufrufe etc) auch eingebunden ist, also am liebsten einen globalen Ort für alle Einbindungen haben. Wo platziere ich nun meine #includes und meine Klassen-Deklaration sowie Definitionen?Klasse würde ich wie folgt machen: Sämtliche Funktionen und Attribute der Klasse in Vector3.h deklarieren, alle Funktionen in Vector3.cpp definieren. Liege ich da richtig?
Zweite Frage, ich möchte in einer Funktion To_String meinen Vektor schnell zur kontrolle ausgeben können. Die Funktion soll zurück geben, was die Edit-Felder schlucken. (UnicodeString)
Wo füge ich in meiner Klasse Vector3 nun die #includes dafür ein? (h oder cpp) Beziehungsweise: Kann ich alle #indcludes meiner main.cpp mit einem rutsch in meine Vector3-Klasse einbinden? Ist das sinnvoll?Ich hoffe meine Fragen sind halbwegs verständlich, so ganz ohne Code-Beispiele.
Beste Grüße und Danke im Voraus
-
Hört sich irgendwie so an, als ob du Logik und GUI vermischen wollen würdest. Mach das nicht. Das ist DAS No-Go.
D.h., deine Vector Klasse darf schon mal überhaupt nichts über deine main und deine Textfelder oder sonst was wissen.Je weniger du in Headern inkludierst, desto besser. Verwende lieber Vorwärtsdeklarationen, wenns geht und inkludiere dann in der cpp.
Globale oder zentrale Stellen für Includes sind auch eine schlechte Idee. Du wirst das alles nicht brauchen. Aber jedesmal wenn du irgendwo etwas änderst, wirst du dein ganzes Projekt neubauen müssen, obwohl nur 0,1% des Codes betroffen wäre.
-
soweit verstanden. In der main.h nur die eigenen Klassen inkludieren und in den Klassen unabhängig von main das nötige einbinden. Wo sollte ich dann die nötigen Libaries für die Vektor-Klasse einbinden, in der .h oder der .cpp?
-
Was wäre für die Vektorklasse denn an includes nötig? So gesehen eigentlich nichts?
-
natürlich nicht viel aber ich hab noch andere klassen.
Wenn ich z.B. die UnicodeStrings fürs debuggen brauche, wo sollte ich die passende #include platzieren?
-
UnicodeString? std::string kann auch unicode, macht keinen Sinn, das Rad neuzuerfinden.
Wie ich gesagt habe, je weniger du in Headern inkludierst, desto besser. Wenn dir eine Vorwärtsdeklaration reicht, dann benutz die und inkludiere erst, wenn du wirklich die Definition brauchst (in der cpp dann).
-
wenn ich bei
Edit1->Text
abwarte, wird gezeigt, dass die Variable ein UnicodeString ist. Ich bin mir nicht mehr sicher, ob es mit nem std::string net funktioniert hat, aber ich dachte, das ist eine Klasse vom C++ Builder.
Mir ist es fast peinlich zu fragen aber was bezeichnet man als Vorwärtsdeklaration?
-
Achso, mir war nicht klar, dass VCL hier ein eigenes Süppchen kocht. Ich dachte, das wär eine Klasse von dir. Macht für mich zwar trotzdem wenig Sinn, aber gut, wenn die das so machen...
Bei der Vorwärtsdeklaration sagst du im Prinzip, dass es die Klasse gibt und die Deklaration später kommt, damit der Compiler zufrieden ist. Also wenn du z.B. eine Methodendeklaration angibst, die einen als Parameter einen Zeiger auf eine Klasse bekommt, brauchst du die Definition dieser Klasse noch nicht, deswegen würde hier eine Vortwärtsdeklaration reichen. z.B. so:
class Klasse; void foo(Klasse* cls);
Aber das sind alles absolute Grundlagen, ich würde dir empfehlen, ein richtiges C++ Buch zu nehmen und erstmal richtig durchzuarbeiten. Als ich mit C++ angefangen habe, hab ich auch den Fehler gemacht, gleich mit einer IDE und einem GUI System anzufangen, nur wars bei mir damals VS und MFC. Das war alles eher kontraproduktiv, ich hab vieles nicht verstanden, hab mich über vieles geärgert und bin ständig auf die Nase gefallen. C++ ist halt eine Sprache, mit der man sich intensiv beschäftigen sollte. Sowas wie MFC oder VCL ist am Anfang eigentlich nur schädlich.
-
naja, ein ordentliches C++-Buch habe ich schon aber ich komme nie dazu, mal ordentliche c++-projekte zu machen. (Wegen dem Studium bis jetzt immer mit c oder java beschäftigt gewesen)
Der Begriff Vorwärtsdeklaration ist mir schon bekannt gewesen aber an der eigentlichen Bedeutung bin ich bis jetzt wohl durch Zufälle vorbei geschlittert.
Najut, jetzt weiß ich auf jeden Fall weiter, danke für deine Hilfe.
Btw: Ich hab im Gymnasium mit Delphi gearbeitet, mir parallel C++ beigebracht (Grundlagen, während des Abis, nicht soviel Zeit...) und erst später mitbekommen, dass es den C++-Builder gibt. (Kenne halt schon die Grundlagen der GUI-IDE) Versaut wird mein C++-Wissen dadurch sicher nicht.
(Versaut wirds durch Java, irrks)
-
C++ ist nicht Delphi... Ich hab auch mit Delphi angefangen und bin auch sehr lange dabei geblieben, obwohl ich mir nebenbei alle möglichen Sprachen angeschaut habe. C++ hat mir damals nicht zugesagt, weder mit VS/MFC noch mit C++Builder und VCL (kannte ich damals schon, aber nur sehr oberflächlich). Und zwar hat es mir hauptsächlich nicht zugesagt, weil ich die Sprache nicht verstanden habe. Sowas wie VCL usw. versperrt den Blick auf die Sprache, du lernst hauptsächlich paar Bibliothken, ohne die Grundlagen zu verstehen und wirst ständig auf die Nase fallen.
Ich mag die VCL im Zusammenhang mit C++ nicht. Ich finde das Konstrukt irgendwie komisch und nicht C++-Like und dieses UnicodeString bestätigt meine Meinung. Außerdem weiß ich echt nicht, wer den C++ Builder heute noch einsetzt. Ich habe mit dem Teil überhaupt keine Erfahrung, aber so viel ich weiß, wurde es schon früher nur belächelt und nie ernsthaft eingesetzt, und heute eigentlich erst recht.
-
Welche GUI-IDE ist denn ansonsten so zu empfehlen?
Klar ist Delphi nicht = C++ aber wenn man so oder so am Anfang des Werdeganges ist, spart man sich so eventuell das lernen einer kompletten GUI-IDE. Ich kenne halt die Elemente von VCL schon und kann mich so auf C++ konzentrieren.
Vorher habe ich es kurz mit Qt versucht aber ich bin jedes mal voll gegen die Wand gefahren weil ich alle 5 Minuten dinge googlen musste, deren Funktionsweise ich beim C++-Builder schon kenne.
-
Bin mir grad nicht sicher, was du mit "GUI-IDE" meinst. Welche IDE du verwendest, ist ziemlich egal (außer vielleicht C++ Builder, wenn er sich nicht ohne VCL verwenden lässt).
Du solltest halt erstmal keine GUI Projekte schreiben. Konzentriere dich allein auf die Sprache. Erst wenn du die Sprache ausreichend verstanden hast (mag hört oft, dass man für C++ ein halbes Jahr braucht), kannst du mit GUI Projekten anfangen.
-
Wie gesagt, C++ programmiere ich schon eine weile. Hab schon diverse Konsolen-Programme geschrieben und will jetzt auch kleinere GUI-Projekte starten. (Dabei soll es nicht wirklich um die GUI gehen, ein RayTracer hat ja auch nicht viel damit zutun.)
GUI-IDE, Irgendeine Entwickler-Umgebung bzw. C++-Libary, die GUIs unterstützt und möglichst so professionell ist, das man nicht andauernd wechseln muss.
-
Ich hatte jetzt aber nicht den Eindruck, dass du schon ausreichend gut C++ kannst
Die Frage nach Vorwärtsdeklarationen, Includes, "main", eine Vektorklasse die irgendwelche GUI-Eingaben kennen sollte... Es fehlt anscheinend noch sehr viel an Verständnis. Das lernt man am besten mit guten Grundlagenbüchern.
Man kann es natürlich auch über den Learning-By-Doing Ansatz probieren. So hab ich das früher mit Delphi gemacht. Auch viel programmiert, ohne es genau zu verstehen. Hab dann erst später verstanden, was ich eigentlich genau gemacht habe. In C++ dann genau so. Aber so hab ich Jahre gebraucht, um C++ halbwegs zu verstehen, wenn man das richtig angeht, geht es schneller.
-
Na dann kamen meine Fragen wohl schlimm an.
Ich bin halt nicht so fit mit den includes bei solchen vorangelegten Projekten und dem aufteil von Deklaration und Definition. Die Vektorklasse sollte nur ne einfache Möglichkeit der Ausgabe während der Entwicklung haben und ich dachte, der C++-Builder hat da seine eigene klassen.
Aber mal zurück zur klasse, was für Libaries benutzt man am besten für GUIs? (es geht letztendlich wirklich nur um ein Fenster, auf dem ich in ruhe Pixel zeichnen kann um meinen rayTracer zu programmieren.
)
-
Es gibt noch viel mehr Sachen in C++, die man kennen sollte. Ich sprech das aus Erfahrung
Ich hatte auch schon recht viel Erfahrung in Delphi, C# und Java und bin trotzdem nicht mit C++ zurechtgekommen. Es gibt einfach sehr viele Sachen, die man aus anderen Sprachen nicht gewohnt ist. Und dann gibts noch viele Idiome usw., die man kennen sollte. Ich vermute einfach, wenn du schon Probleme mit includes und ähnlichem hast, dass es noch viel mehr in C++ gibt, was du noch nicht kennst. Ich war auch selbst mal in der Phase, wo ich keine Ahnung hatte, aber dachte, ich wüsste genug, um an Projekten mitzuarbeiten.
Was GUI Bibliotheken angeht. Ich persönlich kenne mich am besten mit Qt aus, das benutzen wir in der Arbeit. GTK+ (bzw. gtkmm in C++) und wxWidgets werden ähnlich gut sein, hab damit aber nicht sehr viel gemacht. Das sind auch die Frameworks, die man in richtigen Projekten am ehesten vorfindet. MFC ist völlig veraltet, findet man leider aber immer noch recht häuftig. C++ Builder und VCL ist glaube ich nur eine Spielerei, kann mir jetzt nicht vorstellen, dass es tatsächlich professionell eingesetzt wird, hab sowas noch nie gehört.
-
Na an Projekten will ich nicht mitarbeiten, dass will ich niemanden antun.
Aber ich muss halt irgendwo üben und da wir nächstes Semester C++ haben, bin ich zuversichtlich, dass ich spätestens dann noch nen ordentlichen Schub bekommen möchte.
Ich bin ja keiner von denen, die kaum C++ können aber schon ihr erstes 2D-Game programmieren müssen.
-
ruhig_brauner schrieb:
Aber ich muss halt irgendwo üben und da wir nächstes Semester C++ haben, bin ich zuversichtlich, dass ich spätestens dann noch nen ordentlichen Schub bekommen möchte.
Will dich nicht enttäuschen, bin da aber auch etwas skeptisch
An Hochschulen wird sehr oft ziemlich schlechtes C++ gelehrt.
-
Na dann muss ich wohl doch nochmal den dicken Schmöker raus hohlen.
-
Muss gar nicht so dick sein... Was mir z.B. am Anfang weitergeholfen hat, waren die Bücher von Scott Meyers, und die sind nicht dick.