Ich wechsle routinemäßig zwischen C# und C++, und das Fehlen von Headerdateien in C# ist eines meiner größten Ärgernisse. Ich kann mir eine Headerdatei ansehen und alles lernen, was ich über eine Klasse wissen muss - wie ihre Memberfunktionen heißen, ihre Aufrufsyntax usw. - ohne durch Seiten des Codes zu waten, der die Klasse implementiert.
Und ja, ich kenne die teilweisen Klassen und #regions, aber es ist nicht dasselbe. Teilweise Klassen machen das Problem sogar schlimmer, weil eine Klassendefinition über mehrere Dateien verteilt ist. Was die #regions betrifft, sie werden nie so erweitert, wie ich es gerne hätte für das, was ich gerade tue, also muss ich Zeit damit verbringen, diese kleinen Pluszeichen zu erweitern, bis ich die Ansicht richtig habe.
Vielleicht wenn Visual Studios Intellisense für C++ besser arbeiten würde, hätte ich keinen zwingenden Grund, so oft auf .h-Dateien verweisen zu müssen, aber selbst in VS2008 kann C++'s Intellisense nicht mit der von C# mithalten
14 Stimmen
Ich glaube, es gibt keinen wirklichen Grund für Headerdateien in C++. Alle darin gespeicherten Informationen sind im .cpp dupliziert und können automatisch extrahiert werden (wie von www.lazycplusplus.com demonstriert - Haftungsausschluss: nicht verwendet). Das Problem ist die Kompilierungsgeschwindigkeit und C#&Java haben gezeigt, dass dies überwindbar ist.
0 Stimmen
Wie kann www.lazycplusplus.com alle Informationen erhalten? Was ist, wenn ich einen void-Pointer in der Header-Datei für zukünftige Verwendung deklarieren und reservieren wollte? Es wird nie in der cpp-Datei verwendet oder referenziert.
1 Stimmen
THanks.... Ich habe auch keine Ahnung, warum es abgelehnt wurde.
3 Stimmen
Brian: Was bedeutet es, einen "Leerzeiger reservieren"? Wie du wahrscheinlich weißt, muss statisch allokierte Daten in C/C++ manuell im .cpp definiert werden, nachdem sie im Header deklariert wurden (es sei denn, es handelt sich um eine Dateibereichs-Deklaration). Mit LazyC++ kannst du einfach die Header-Deklaration überspringen und die Implementierungsdefinition schreiben.
0 Stimmen
Ich würde gerne eine bessere Lösung als Header-Dateien sehen, aber aufgrund von Rückwärtskompatibilitätsproblemen (die oft zu Rückwärtskompatibilitätskämpfen führen - man muss lieben, wie das Ändern von privaten Klassenmembern das ABI bricht und Sie zwingt, PIMPLs zu verwenden) glaube ich nicht, dass wir eine weniger schlimme Alternative haben... Upgevotet.
1 Stimmen
Nicht alle Informationen befinden sich in der CPP-Datei... Ob eine Methode virtuell ist oder nicht, steht sicherlich nicht in der CPP-Datei. Klassenbeziehungen sind ebenfalls nicht Bestandteil der CPP-Datei. Die Liste könnte noch weitergehen, aber das reicht aus, um die Behauptung zu widerlegen.
0 Stimmen
@Iraimbilanja: Ich möchte die Größe der Klasse "auffüllen", um Platz für zukünftige Erweiterungen zu reservieren. Dies ist in Win32-Strukturen recht häufig, um eine reservierte Variable zu sehen, die für nichts verwendet wird. Ich spreche nicht von statischen Elementen.
0 Stimmen
@Iraimbilanja: Ich sehe jetzt, dass LazzC++ dich zwingt, viele Informationen in der cpp-Datei zu duplizieren. Ich hatte wirklich ein Problem mit deiner anfänglichen Aussage, dass "Alle Informationen, die in ihnen [Header-Dateien] gespeichert sind, im .cpp dupliziert werden und automatisch extrahiert werden können", was einfach nicht wahr ist.
0 Stimmen
Tim, in der Tat. Deshalb definiert man in LazyC++ alle Klassenmember innerhalb der Klassendefinition. Zum Beispiel könnte Ihr Quellcode .cpp (nicht Ihr Header, Sie haben keinen) wie folgt aussehen: class Foo { public: void eat() { /*some code*/ } void sleep() { /*some code*/ } };
3 Stimmen
Brian - siehe meine Antwort an Tim. In LazyC++ schreibst du wirklich die Klassendefinition (einschließlich etwaigem Padding), du duplizierst einfach nicht die Dinge. Übrigens ist dein "reservation" ein nicht portabler Hack, du bist besser dran mit dem Cheshire-Cat-Idiom.
0 Stimmen
@Iraimbilanja: Sie können absichtlich Code auf diese Weise schreiben, jedoch wird auch nach dem Ausführen von LazyC++ zwei Dateien generiert und die cpp-Datei wird nicht alle Informationen in der Header-Datei enthalten. Virtuelle Funktionen sind ein viel besseres Beispiel als mein Beispiel mit "unbenutzter Variable".
0 Stimmen
Sicher, die resultierende cpp enthält nicht alle Daten, die im Header vorhanden sind. Warum kümmert es dich jedoch? Es handelt sich nur um ein Implementierungsdetail. Der Punkt ist, dass du dich darum nicht kümmern musst, der Compiler erledigt das für dich.
0 Stimmen
@Iraimbilanja: Lesen Sie Ihren ersten Kommentar noch einmal durch. Es scheint, dass ich meine Header-Dateien aus meinen vorhandenen Cpp-Dateien extrahieren kann, was absurd ist. Ich kann sie jedoch zunächst kombinieren und dann LazyC++ verwenden, um sie zu extrahieren. LazyC++ erfordert, dass Sie kombinieren, aber das ist kein Beweis für Ihre Behauptung "doppelte Informationen".
0 Stimmen
Vereinbart, ich war in meinem ersten Kommentar nicht so klar wie möglich. Das gesagt, vielleicht können wir wieder zum Thema zurückkehren... was denkst du über die Frage des EP?
0 Stimmen
Ja, entschuldige, dass ich ständig poste, Freund, es ist klar, dass wir beide verstehen. Ich bin hin- und hergerissen in dieser Angelegenheit. Das Pflegen einer Header-Datei ist oft mühsam, aber eine einzige riesige Datei kann schwer zu navigieren sein. LazyC++ ist ein interessantes Konzept, aber ich werde mich davon fernhalten, es sei denn, es wird von meinem IDE/Compiler-Anbieter unterstützt.
0 Stimmen
Wie ist diese Frage immer noch offen? Es ist völlig off-topic und sollte als "meinungsbasiert" geschlossen werden.
2 Stimmen
Posting this as a comment because I'm not certain in my information :) and I'm not sure why this is getting voted down and for closing. It's an excellent question IMO. ;)