www.mikrocontroller.net

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


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Christopher C. (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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#:
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!

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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:
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.

Autor: Christopher C. (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Christopher C. schrieb:
> ...kein Buch zur Verfügung hat.

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

Autor: Christopher C. (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Naja so schlimm is nicht ;). Onkel Google gibts ja auch noch.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Rolf Magnus (rmagnus)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net