Wie Zuweisung bei Klassen mit const-Elementen?
-
statt nem const wert ist es besser einen static wert zu nehmen, der ist dann in allen instanzen dieser klasse gleich,du musst nur vor dem ersten aufrufen der klasse allen static eigenschaften einen Wert zuweisen,
das geht dann mit klassenname::eigenschaftsname=Wert//edit hab grad ne gute lösung entdeckt:
static const Wert;
-
Davies Idee ist gut, erkläre mal, wofür die Klasse gedacht ist und was die const-Elemente darstellen.
MfG MAV
-
@otze: Alternativ könnte er ja auch einfach mal ein "Hello, World"-Programm in Pascal schreiben.
Was soll der Quatsch. Warum sollte nicht jede Instanz einen anderen Wert verwenden.
-
Naja, ich weiß aber auch nicht so recht weiter, wenn die Klasse A ein const-Element hat, das im ctor übergeben wird, aber später nicht mehr verändert werden soll...
Ist es dann ein Fehler, wenn = den Wert verändert?Also ich sehe hier gerade das designtechnische Problem nicht.
-
Man müsste mehr über das Design wissen.
Naja, ich weiß aber auch nicht so recht weiter, wenn die Klasse A ein const-Element hat, das im ctor übergeben wird, aber später nicht mehr verändert werden soll...
Ist es dann ein Fehler, wenn = den Wert verändert?Ja.
-
Helium schrieb:
Man müsste mehr über das Design wissen.
Wie Mis2com schon meinte, wird der Klasse über den ctor eine const referenz übergeben, die eigentlich auch nicht verändert werden soll.
Aber ich will diese Klasse mit std::vector nutzen. Und bei einem
my_vector.push_back(A(ref_auf_andere_klasse));
macht die stl anscheinend intern eine zuweisung, da mir der compiler sagt:
error C2582: Die Funktion 'operator =' ist in 'FDX::GraphicMode' nicht verfügbar
hier mal mein code an der stelle:
vecReturn.push_back(GraphicMode(*this, static_cast<MODES>(modeArray[i]), static_cast<BACKMODES>(backmodeArray[u][0]), FDX_D0, cFlags));
Könnte eigentlich ein const_cast helfen, um das const (nur in diesem fall) "wegzubekommen"? (Hab mir gerade erst angewöhnt die neuen casts zu verwenden und hab deshalb noch nicht so die ahnung drüber)
edit: ein static geht übrigens in meinem fall leider nicht
-
nochmal ganz langsam zu mitschreiben:
eine Konstante hat einen konstanten Wert. Wenn sich dieser Wert ändert, ist es keine Konstante mehr.Also mach es einfach non-const.
-
Helium schrieb:
@otze: Alternativ könnte er ja auch einfach mal ein "Hello, World"-Programm in Pascal schreiben.
Was soll der Quatsch. Warum sollte nicht jede Instanz einen anderen Wert verwenden.
klonk eigentor.
er will die konstante beim copy constructor übertragen können, ohne nen fehler zu kassieren(also const nem const zuweisen),und da const werte eigentlich bei der definition initialisiert werden,und normalerweise überall gleich sind(deshalb sind sie ja konstanten) ist ein static relativ perfekt,denn irgendwie muss er ja wohl den const wert in die instanzen bekommen oder?ich weis nicht, was er machen will, und deshalb schieß ich einfach mal ins blaue und gebe vorschläge raus,wenns dir nicht passt kannste ja selber mal was zum thema beitragen.
@topic ich hab da grad was in der c hilfe gefunden, vielleicht hilft dir ja das weiter:
A pointer can indirectly modify a const variable, as in the following:
*(int *)&my_age = 35;
so, nun musste "nurnoch" den = operator überladen, und dabei den const wert mithilfe eines pointers verändern,oder du kannst ne variable nehmen, und einfach drauf achten, dass du sie nicht veränderst
-
bloß nicht.
wenn der wert nicht konstant sein soll, dann deklarier ihn nicht konstant. wenn er für alle klassen gleich ist, nur dann static const.
-
natürlich sind solche konstanten etwas ungewöhnlich, aber es kann fälle geben, wo es rein von der übersichtlichkeit her sinn macht:
ein beispiel ist die gravitationskonstante const g=9.81.
natürlich ist es eine constante-hier auf der Erde, auf dem Mars ist der Wert wieder komplett anders.
g ist die klassische physikalische bezeichnung für diese konstante und jeder der const g sieht, weis dass es die gravitation ist.
ganz anders sähe es bei const_g/gravity aus-aber das ist rein subjektiv.
Wenn man also eine Klasse für die simulation verschiedener planeteneigeschaften definiert, und die kollegen alle physiker sind, dann wirds wohl einen Sinn haben,aber wie gesagt, dass ist sehr subjektiv und vorallem ungewöhnlich.
Aber im endeffekt ist es ausserdem die Sache des programmentwicklers wie ers machen will, wenns sich im endeffekt als fehler rausstellt, wird ers sicher auch nie wieder machen :D.´
Ich soreche da aus erfahrung
-
otze schrieb:
klonk eigentor.
er will die konstante beim copy constructor übertragen können, ohne nen fehler zu kassieren(also const nem const zuweisen),und da const werte eigentlich bei der definition initialisiert werden,und normalerweise überall gleich sind(deshalb sind sie ja konstanten) ist ein static relativ perfekt,denn irgendwie muss er ja wohl den const wert in die instanzen bekommen oder?Meinst du damit, dass man dem const-Member sowieso keinen Wert zuweisen kann wenn es nicht static ist? Fall ja: Wie wärs mit der Konstruktorinitialisierungsliste?
-
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.
-
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; };