Konstante aus benutzerdefinierte Klasse

Rene42

Erfahrenes Mitglied
Hallo miteinander,

ich habe mir eine Klasse Datum geschrieben:

C++:
namespace RBO {

 class Datum {

  public:

      Datum();
      Datum(int, int, int);
 
      //Auf Kapslung wird verzichtet
      //Es gibt keine ungültigen Daten
      int Tag = 22;
      int Monat = 9;
      int Jahr = 1986;

      //Liefert das Nulldatum (verwendet wird hier der 01.01.2000)
      static const Datum Nulldatum;

 };

}

In einer Quellcode Datei stehen die passenden Definitionen:

C++:
RBO::Datum::Datum() {};
RBO::Datum::Datum(int T, int M, int J) { Tag = T; Monat = M; Jahr = J;};

const RBO::Datum::Nulldatum = RBO::Datum::Datum(1,1,2000);

Nun sagt der Compiler Nulldatum not name a type. Hier komm ich nicht mehr mit, ich versuche ja Nulldatum als Konstante vom Typ Datum anzulegen.
 

cwriter

Erfahrenes Mitglied
lass mal in der Klasse das const weg, sonst wirst Du den Wert nicht ändern können !
Das stimmt, ist hier aber nicht direkt der Fehler.

Nun sagt der Compiler Nulldatum not name a type. Hier komm ich nicht mehr mit, ich versuche ja Nulldatum als Konstante vom Typ Datum anzulegen.
Das Problem ist, dass du bei der Zuweisung noch ein const zuviel hast:
Du schreibst
C++:
const Datum::Nulldatum = x;
Der Compiler liest "const" und denkt sich, dass wie bei "const int i =123;" ein Typ, und dann der Bezeichner folgt.
Da du das Objekt aber schon definiert hast, darfst du das const nicht mehr zu schreiben.
Vergleiche:
C++:
const int i = 42;
const i = 123; //Was soll das schon machen? i ist ja schon const
Und es macht auch wenig Sinn, zu sagen: Ich weiss, dass diese Variable konstant ist, aber ich will sie ändern.

Die Lösung ist also: Lass beide consts weg.

Gruss
cwriter

PS: Noch ein Tipp zur Benennung der Funktionen: Natürlich kannst du in der .cpp-Datei alle Funktionsdefinitionen mit Absolutem Scope angeben (bei dir RBO::Datum::foo), aber du kannst auch namespace RBO {}; (wie in dem Header) benutzen, um die einzelnen Präfixe zu sparen. Hier ist es jetzt nicht so schlimm, aber wenn deine Klasse 100 Funktionen hat, wird es mit der Zeit mühsam, alles auszuschreiben.
Es gibt natürlich auch hier Präferenzen, und dein Ansatz ist nicht falsch, das ist nur als Hinweis gemeint.
 

Rene42

Erfahrenes Mitglied
Ich stand einfach auf dem Schlauch. Ich hatte den Typ
C++:
RBO::Datum
(macht mir ohne Codetags doch glatt aus : D einen Smiley) nicht angegeben, also konnte das auch nicht gehen.

Habe nun falls nochmal einer sucht:

C++:
const Datum Nulldatum; //Deklaration in h
const RBO::Datum RBO::Datum::Nulldatum = Datum(1,1,2000); //Definition in cpp