Konstante Variabele initialisieren
-
mal ne doofe frage, aber ich kriegs irgendwie nich hin und hab schon alles mögliche ausprobiert, was ich im netz finden kann, also ich hab den header:
#if !defined(CPPDE_MONTH_H__INCLUDED) #define CPPDE_MONTH__INCLUDED #include <string> #include <iostream> class Month { private: const int firstJanuray1980; int monthNumber; int yearNumber; bool isLeapYear(); public: Month(int number, int year); void print() const; }; #endif
und die cpp datei
//--------------------------------------------------------------------------- #include "Month.h" #pragma hdrstop #include <iostream> #include <tchar.h> //--------------------------------------------------------------------------- bool Month::isLeapYear() { } void Month::print() const { } Month::Month(int number, int year) { monthNumber = number; yearNumber = year; }
kann mir jemand erklären wie ich "firstJanuary1980" mit einem Wert initialisieren kann, am besten beim konstruktor aufruf... sofern das möglich ist
-
Stichwort: Initialisierungsliste.
-
[quote="Nickolaus"]
#ifndef CPPDE_MONTH_H__INCLUDED #define CPPDE_MONTH__INCLUDED #include <string> #include <iostream> class Month { private: const int firstJanuray1980 = 0; int monthNumber; int yearNumber; bool isLeapYear(); public: Month(int number, int year); void print() const; }; #endif
Sollte doch so gehen, oder?
-
Ich behaupte mal, dass das
const
fürfirstJanuray1980
dort nicht hingehört. Ich kann aber auch nicht erraten, wozufirstJanuray1980
gut sein soll. Vielleicht hast Du ja einen guten Grund dafür -- ich halte es nur für sehr unwahrscheinlich.
-
Initialisierungsliste.
Month::Month(int number, int year) : firstJanuary1980(42) { ... }
Oder gleich ein enum:
class Month { private: enum { firstJanuary1980 = 42 }; .... };
-
nee hab keinen grund is nur bei dem blöden buch mit dem ich für die uni arbeiten muss mit vorgegeben...
wenn ich sowas mache:
const firstJanuary1980 = 0;dann krieg ich als fehlermeldung:
E2233 Klassen-Member kann hier nicht initialisiert werden
-
Da ich mal annehme, dass der erste Januar 1980 in allen Instanzen gleich sein wird:
class Month { static const int firstJanuray1980 = 0; //... }
-
super geil, danke so funktionierts...
warum muss ich die variabele denn auch noch auf "static" setzen... nur so von ner logik halber, wer es ganz interessant das zu wissen
-
Eine normale Klassenvariable existiert für jede Instanz der Klasse unabhängig voneinander. Daher kannst du ihr auch keinen allgemeinen Wert geben.
Eine static-Variable existiert dagegen nur einmal für alle Objekte zusammen.Die Variable wird daher auch anders angesprochen, nämlich mit Klassenname::variable statt Objektname.variable
-
Noch ein paar Randbemerkung zum Thema
class klasse { public: static int const konstante = 42; };
1. Der Initialisierer wird nur für Ganzzahltypen zugelassen. Das ist eine Sonderregel.
2. Es handelt sich hier immer noch um eine Deklaration. Die Variable "konstante" wurde hier nicht definiert. Das ist OK, solange man nur den Wert der Konstanten benötigt und nicht die Adresse der Variablen "konstante". Denn ohne Definition wird auch kein Speicher reserviert und der Linker würde sich beschweren, wenn man irgendwo zB &konstante schreiben würde. Wird nur der Wert benötigt, ersetzt der Compiler den Namen "konstante" direkt durch die Zahl, die als Initialisierer angegeben worden ist -- in diesem Fall 42.
-
krümelkacker schrieb:
1. Der Initialisierer wird nur für Ganzzahltypen zugelassen. Das ist eine Sonderregel.
Hmm ... bin mir da grad nicht sicher. Das trifft wahrscheinlich allgemein auf alle "Literal-Typen" zu, also zB auch double ... Bin aber grad zu Faul das zu überprüfen.