T
hustbaer schrieb:
tntnet schrieb:
Frido schrieb:
So jetzt hab ich weitergemacht und das ganze in ne Klasse gepackt jeweils als Statische Methoden.
Nur mal so nebenbei: Warum? Welchen Sinn macht es eine Klasse nur mit statischen Methoden zu definieren? Das macht nur in Programmiersprachen Sinn, die nichts besseres anzubieten haben. Aber in C++ gibt es Namespaces.
Namespaces gibt es in Java oder C# auch. Aber in C++ gibt es freie Funktionen (und Namespaces)
Danke für die Korrektur. Du hast natürlich recht .
Frido schrieb:
Edit: Jetzt hab ich wieder in einen Namespace und siehe da kein Fehler. Aber WARUM ??? Ich versteh echt garnix mehr Ich mein das mit den Statischen Methoden müsse doch auch gehen...
Edit² : Langsam glaub ich es liegt am Linker ... wenn ich alles was im Ordner Debug ist lösche geht's :o
Ich versuche es mal möglichst kurz zu erklären.
Wenn der Compiler eine Implementierung einer Funktion sieht, dann implementiert er die Funktion halt. Die steht dann in der Objektdatei. Wenn Du 2 Source-Dateien hast, dann hast Du auch 2 Objektdateien. Und wenn Du die Funktion im Header definiert hast, dann findet der Linker sie in beiden Objektdateien. Dann kommt es zum Linkerfehler, dass die Funktion 2 mal definiert ist.
Wenn der Compiler im Header eine Funktionsdeklaration sieht, also eine Funktion ohne Body, dann merkt er sich erst mal einfach, dass er die Funktion braucht. Entweder der Compiler sieht die Implementierung der Funktion später oder es bleibt zunächst als unaufgelöstes Symbol in der Objektdatei. Der Linker kümmert sich dann darum, dass das Symbol gebunden wird.
Ein wenig anders verhält es sich, wenn eine Funktion inline definiert ist oder ein Template ist. Inlinen kann der Compiler nur, wenn er die Funktionsdefinition auch sieht. Daher muss die Funktionsdefinition gleich erfolgen. Der Compiler exportiert diese Funktion aber nicht, da er den Body ja nur zum inlinen braucht. Der Linker sieht die Funktion dann auch nicht und es kommt zu keinen Mehrfachdefinitionen.
Ein Template ist im Prinzip nur eine Bauanleitung für den Compiler. Auch hier wird kein externes Symbol erzeugt und daher ist es auch hier wieder kein Problem, wenn die Definition im Header erfolgt.
Alles klar?