Wie Zuweisung bei Klassen mit const-Elementen?
-
Ich hab gerade noch mal über die Sache nachgedacht (sollte ich mal öfters tun
)ich kann doch eigentlich in meinem fall gar keine referenzen verwenden, oder?
weil ich habe eine klasse GraphicAdapter, die durch eine methode mehrere kopien der klasse GraphicMode in einem std::vector zurückgibt.
Jede Instanz der Klasse GraphicMode hat über den ctor eine referenz auf die klasse GraphicAdapter.
Wenn man jetzt folgendes macht:
vector<GraphicMode> funktion() { GraphicAdapter ga; return ga.GetModes(); } int main(void) { vector<GraphicMode> vec = funktion() vec[0].MacheEtwas(); // Poff, oder? ... }Sollte es doch Fehler geben, da die an GraphicMode übergebene Referenz auf GraphicAdapter nicht mehr gültig ist, oder???
Statt Referenzen zu verwenden müsste ich also den GraphicAdapter an jede Instanz von GraphicMode per value übergeben, oder?
-
otze schrieb:
mhh da hab ich mich schlecht ausgedrückt...seufz.
Konstanten sind für mich ein Wert, der einmal definiert ist,und überall in meinem Programm bzw den instanzen einer Klasse den gleichen Wert haben sollte.
Wenn man den const wert dann in verschiedenen instanzen einer klasse haben will, hat man 2 möglichkeiten:man weist ihm jedes mal den gleichen Wert zu(ausser man hat gute gründe die dagegensprechen, zb die von mir genannte übersichtlichkeit),oder man definiert ihn als static.Und was ist wenn jede Instanz einen eindeutigen konstanten Wert haben soll? Ich verstehe deine Argumentation nicht.
-
ist eine konstante eine konstante, wenn sie überall anders ist?
-
ja, schließlich kann jede instanz einer klasse den const-wert anders belegen.
const werte haben ja nicht nur den Sinn einer numerischen Konstante sondern sollen auf Klassen angewendet das unabsichtliche Ändern der Eigenschaften der Klasse verhindern.
Aber könnt ihr mir vielleicht bei diesem "per value oder reference" problem helfen? Ich bin mir da echt nicht mehr sicher...

-
otze schrieb:
ist eine konstante eine konstante, wenn sie überall anders ist?
Ja, andernfalls wäre sie eine statische Konstante. Konstante heißt ja nur, dass du sie nicht ändern darfst.
-
OP:
Wenn die GraphicMode Objekte in dem Vektor Referenzen auf das GraphikAdapter-Objekt aus "funktion" beinhalten, sind die nach Verlassen der Funktion ungültig. Wie du das löst hängt auch davon ab, was du genau tun willst.otze:
class Planet { const int g; //um ein beispiel von dir aufzugreifen public: Planet (int grav) : g(grav) {} };jetzt zwei instanzen
Planet Erde(9.81); Planet Mars(3.71);sollte wohl für immer konstant sein.
unsinnig ist dann beispielsweise sowas:Erde = Mars;na kein wunder, dass das nicht funktioniert.
was du machen könntest:pair<Planet,Planet> Splitter = Erde.split ();- da stören auch die konstanten nicht.
deshalb nehm ich wohl an, es handele sich um einen designfehler.(btw. der von dir angeführte cast ist böse, weil er undefiniertes verhalten hervorruft)
-
EnERgYzEr schrieb:
ja, schließlich kann jede instanz einer klasse den const-wert anders belegen.
const werte haben ja nicht nur den Sinn einer numerischen Konstante sondern sollen auf Klassen angewendet das unabsichtliche Ändern der Eigenschaften der Klasse verhindern.
Aber könnt ihr mir vielleicht bei diesem "per value oder reference" problem helfen? Ich bin mir da echt nicht mehr sicher...

Kannst du des nochmal genauer ausführen? Mir ist insbesondere das return in funktion() nicht klar.
btw. man kann auch const Referenzen zurückgeben.
-
Die Gravitationskonstante kann man aber sehr gut statisch definieren:
class Ball { private: static const float g = 9.81f; };
-
das ist wahr, nur sollte man sie auch mit dem richtigen wert initialisieren ( http://de.wikipedia.org/wiki/Gravitationskonstante )
anders als die schwerkraft auf der oberfläche der erde (ca. 9.8) und die auf der des mars (ca. 3.7)
-
Stimmt, was ich geschrieben hatte, war der Ortsfaktor...