002
20.08.2008, 16:28 Uhr
0xdeadbeef
Gott (Operator)
|
Zunächst mal lege ich dir die Lektüre von www.eng.hawaii.edu/Tutor/Make/ nahe. Es handelt sich dabei um ein make-Tutorial, wobei der make-bezogene Teil für dich vorerst nicht weiter wichtig ist. Am Anfang beschreibt es allerdings, wie die Kompilation von C-Programmen funktioniert, und da der Mechanismus in C++ der selbe ist, sollte das dem Verständnis weiterhelfen.
Vom technischen her, #include macht nichts anderes als Textersetzung, wie alle Präprozessordirektiven. Das heißt,
nimmt den Inhalt von incl.h und fügt ihn da ein, wo diese Direktive steht. Erst nachdem der Präprozessor durch ist, geht das Ergebnis an den eigentlichen Compiler. Konkret bedeutet das, dass der Compiler gar nicht mehr sieht (oder sich zumindest nicht mehr dafür interessiert), aus welchen Dateien der Kram ursprünglich kam.
Im Folgenden gehe ich davon aus, dass du den obrigen Link bereits gelesen hast.
Der Grund dafür, dass man C++-Code in Header- und Source-Dateien aufteilt, liegt dann beim Linker. Header-Dateien enthalten Deklarationen, aber keine Implementierung (Templates lassen wir für den Moment beiseite), Source-Dateien enthalten die Implementierung der im Header deklarierten Dinge. Wenn man Source-Dateien einbände, tauchte der selbe Code - beziehungsweise gleich benannter Code - in mehreren Objekten auf, und der Linker wüsste nicht, welchen er denn jetzt benutzen soll.
Konkret für deinen Fall bedeutet das, trenn die Klasse auf, z.B. in
C++: |
// dog.hpp #ifndef INCLUDED_DOG_HPP #define INCLUDED_DOG_HPP
class dog { public: void age(int); int age() const;
private: int age_; };
#endif
|
C++: |
// dog.cpp #include "dog.hpp"
void dog::age(int age) { age_ = age; } int dog::age() const { return age_; }
|
C++: |
// main.cpp #include "dog.hpp"
#include <iostream>
int main() { dog d;
dog.age(4); std::cout << dog.age() << std::endl; }
|
Nachtrag: Im Übrigen muss main im globalen namespace liegen, sonst ist sie lediglich eine merkwürdig benannte Methode
Nachtrag 2: Gewöhn dir bloß nicht diesen #pragma once-Unsinn an, einige Compiler hauen dir das um die Ohren. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 20.08.2008 um 16:30 Uhr von 0xdeadbeef editiert. |