Datum:
Hallo, ich schreibe derzeit eine kleine Mathematik Bibliothek in Sachen Vektoren und Matrixen. Nun wollte ich meiner Vector3D Struktur eine statische Konstante Zero hinzufügen, wie ich es aus C# gewohnt bin. Dies scheint allerdings in C++ anders zu funktionieren. Also meine Frage: wie mach ich das? Hier die Beispiele: C#:
public struct Vector3D { private float X; private float Y; private float X; public Vector3D(float x, float y, float z) //... static readonly Vector3D Zero = Vector3D(0f, 0f, 0f); } |
C++:
struct Vector3D { private: float X; float Y; float Z; public: Vector3D(float x, float y, float z); //... static Vector3D const Zero = { 0.0f, 0.0f, 0.0f }; //<-- geht nicht } |
Vielen Dank!
Datum:
In der Deklaration (also z.B. in Vector3D.h) steht die Klasse, da kann aber keine Definition z.B. von statischen Elementen rein (nur die Deklaration). Deshalb sollte es auf eine .h und eine .cpp aufgeteilt werden. Vector3D.h:
struct Vector3D { private: float X; float Y; float Z; public: Vector3D(float x, float y, float z); // Deklaration des ctor //... static const Vector3D Zero; // hier nur die Deklaration des 0-Vektors }; |
und die Vector3D.cpp:
const Vector3D Vector3D::Zero( 0.0f, 0.0f, 0.0f ); // und hier die Definition des 0-Vektors Vector3D::Vector3D(float x, float y, float z) // Definition des ctor : X(x) , Y(y) , Z(z) { ... } |
Eine Funktionsdefinition, z.B. die des Konstruktors, könnte auch direkt in die Klasse und damit in die Headerdatei. Dann wäre sie automatisch als inline deklariert. Bei Daten geht das nicht, weil deren Definition nur an einer Stelle im gesamten Programm stehen darf, bei mehrfachem #include der Headerdatei in verschiedenen Übersetzungseinheiten würde also dann der Linker über Mehrfachdefinitionen meckern.
Datum:
Vielen Dank für die ausführliche Erklärung! Jetzt gehts. Ist halt problematisch, wenn man C und C# kann, nun C++ verwenden muss und kein Buch zur Verfügung hat. Jede Sprache hat so ihre Eigenheiten :). Das mit der Trennung, also Header und .cpp Dateien wende ich schon an, war halt nur ein schnell eingetipptes Beispiel. mfg
Datum:
Christopher C. schrieb: > ...kein Buch zur Verfügung hat. Das ist jetzt nicht dein Ernst, oder? Sollen wir eine Sammlung machen? :-)
Datum:
Naja so schlimm is nicht ;). Onkel Google gibts ja auch noch.
Datum:
Klaus Wachtler schrieb: > Bei Daten geht das nicht, weil deren Definition nur an einer Stelle im > gesamten Programm stehen darf, bei mehrfachem #include der Headerdatei > in verschiedenen Übersetzungseinheiten würde also dann der Linker über > Mehrfachdefinitionen meckern. soweit ich mich erinnere, geht das mit primitiven Tpyen doch, dass man im Header static const int irgendwas = wert schreibne kann.
Datum:
Vlad Tepesch schrieb: > Klaus Wachtler schrieb: >> Bei Daten geht das nicht, weil deren Definition nur an einer Stelle im >> gesamten Programm stehen darf, bei mehrfachem #include der Headerdatei >> in verschiedenen Übersetzungseinheiten würde also dann der Linker über >> Mehrfachdefinitionen meckern. > > soweit ich mich erinnere, geht das mit primitiven Tpyen doch, dass man > im Header static const int irgendwas = wert schreibne kann. Ja, das geht, allerdings nur für Integer-Typen und Enums.