Forum: PC-Programmierung C++: statische Konstante in Struktur


von Christopher C. (Gast)


Lesenswert?

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#:
1
public struct Vector3D
2
{
3
private float X;
4
private float Y;
5
private float X;
6
7
public Vector3D(float x, float y, float z)
8
//...
9
10
static readonly Vector3D Zero = Vector3D(0f, 0f, 0f);
11
}

C++:
1
struct Vector3D
2
{
3
private:
4
float X;
5
float Y;
6
float Z;
7
8
public:
9
Vector3D(float x, float y, float z);
10
//...
11
static Vector3D const Zero = { 0.0f, 0.0f, 0.0f }; //<-- geht nicht
12
}

Vielen Dank!

von Klaus W. (mfgkw)


Lesenswert?

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:
1
struct Vector3D
2
{
3
private:
4
  float X;
5
  float Y;
6
  float Z;
7
8
public:
9
  Vector3D(float x, float y, float z); // Deklaration des ctor
10
  //...
11
  static const Vector3D Zero; // hier nur die Deklaration des 0-Vektors
12
};

und die Vector3D.cpp:
1
const Vector3D Vector3D::Zero( 0.0f, 0.0f, 0.0f ); // und hier die Definition des 0-Vektors
2
3
Vector3D::Vector3D(float x, float y, float z) // Definition des ctor
4
  : X(x)
5
  , Y(y)
6
  , Z(z)
7
{
8
   ...
9
}

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.

von Christopher C. (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

Christopher C. schrieb:
> ...kein Buch zur Verfügung hat.

Das ist jetzt nicht dein Ernst, oder? Sollen wir eine Sammlung machen? 
:-)

von Christopher C. (Gast)


Lesenswert?

Naja so schlimm is nicht ;). Onkel Google gibts ja auch noch.

von Vlad T. (vlad_tepesch)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.