Original von np
Mit welchem Befehl linkst Du denn?
g++ linkt für mich direkt nach dem Kompilieren:
g++ -o main main.o Triangle.o Solid.o
(nachdem ich zuvor jede *.cc mit g++ -c <cc-file> kompilierte)
Inzwischen schlägt das Linken auch dann fehl, wenn ich
Solid s;
schreibe.
Es sind aber inzwischen andere Fehler. Am Konstruktor von Solid liegt es nicht mehr.
Ich habe den Fehler gefunden. Es ist denkbar blöde und einfach - jetzt wo ich es weiß.
Ich vergaß doch tatsächlich, Vector3d.cc zu übersetzen.
Es muss also heißen:
g++ -o main main.o Triangle.o Solid.o Vector3d.o
Daraus ziehe ich die Lehre, ein Makefile zu schreiben.
Solid s; konstruiert ein Objekt s vom Typ Solid mittels default-Konstruktor Solid:
olid() (das ist es, was Du willst).
Solid s(); deklariert eine (leere) Funktion ::s() ohne Parameter mit Rückgabetyp Solid (das willst Du sicher nicht). Dies erklärt, warum Version II linkt, aber nicht tut, was sie soll.
Der historische Grund für dieses seltsame Verhalten ist, dass früher void-Funktionen als Solid s(void); deklariert werden mussten. Weil das gewissen Leuten (und Java-Programmierern) zuviel zu tippen war, musste die (logische aber selten gebrauchte) Konstruktor-Variante Solid s(); dran glauben.
Aha, das ist interessant. Danke für die Hilfe.
Geschachtelte Funktionen sind in C++ aber verboten. Also kann
Solid s();
innerhalb von main() keine Funktion deklarieren.
Dazu Bjarne Stroustrup in seinem
Standardwerk (Anhang A.7):
"Die Grammatik erlaubt das beliebige Schachteln von Deklarationen. Es gibt allerdings einige semantische Einschränkungen. Geschachtelte Funktionen (Funktionen, die lokal in anderen Funktionen definiert werden) sind z.B. nicht erlaubt."
Und tatsächlich kompiliert die Variante mit
Solid s();
ohne Probleme.
Jetzt kann's also richtig losgeh'n!