Wie kann ich eine konstante Variable beschreiben?
-
1. Ich kann ein struct mit Konstanten Integer gar nicht konstruieren ohne Kontruktor oder der Lösung von Bashar.
2. Mit Konstruktor ist das folgende gemeint:struct Test { int const a; Test(int a_) // <- Das ist ein Konstruktor! Bitte nachlesen! : a(a_) { } }; // Irgendwo: Test test(10); // a hat nun den Wert 10.3. Es gibt noch die unprofessionelle, absolut hässliche und nicht empfehlenswerte Art und Weise:
struct Test { int const a; }; // Irgendwo: Test test; // Falls das bei dir wirklich geht, bei mir nicht. int& a = const_cast<int&>(test.a); a = 10;Grüssli
-
^^ thx für die Lösung. Ich habs jetzt so gemacht wie Bashar vorgeschlagen hat.
Übrigens ich weiß was ein Konstruktor ist aber ich kenne diesen nur aus den Klassen, hab nicht gewusst das es au bei Struct geht.
-
Horaz schrieb:
Leider kann ich, nachdem ich den Struct erzeugt hab, die Variablen nicht beschreiben.
Natürlich, das ist genau das, was konstant bedeutet. Du solltest dich entscheiden, was du wirklich willst. Abgesehen davon sind konstante Member häufig eine Programmierlüge: was konstant ist, ist das konkrete Klassenobjekt als Ganzes, die einzelnen Member sind es oft nur, weil das Klassenobjekt selbst konstant ist (der Grund für die Konstanz der Member ist also nicht in den Membern selbst zu finden). Und der Fehlschluss besteht darin, dass sich daran etwas ändert, nur weil möglicherweise alle Klassenobjekte dieses Typs in einem Programm konstant sind.
-
Hallo
Horaz schrieb:
Übrigens ich weiß was ein Konstruktor ist aber ich kenne diesen nur aus den Klassen, hab nicht gewusst das es au bei Struct geht.
Structs und Klassen sind genau das gleiche, bis auf den Standardzugriff (bei class privat bei struct public)
chrische
-
Horaz schrieb:
Ich weiß das ich auch darauf verziehten könnte und zwei normale Variablen verwenden, doch ich finde es so schöner und professioneller.
Nur weil da
conststeht? Mach doch, wie camper gesagt hat, das Sinnvollere. Sollen die Member nicht mehr änderbar sein (d.h. bei der Konstruktion des Objekts steht ihr Wert fest), ebenconst. Willst du sie später noch verändern, dann nimm normale Variablen.Es hat mich übrigens gewundert, dass sich hier noch niemand über den Ausdruck "konstante Variable" aufgeregt hat

-
Hat diese Art der Initialisierung bei Aggregat-Klassen einen bestimmten Namen ?
-
KasF schrieb:
Hat diese Art der Initialisierung bei Aggregat-Klassen einen bestimmten Namen ?
Copy-Initialisierung? Wahrscheinlich nicht, was du meintest.
Initialisierung mittels Aggregatinitialisierungsliste im Gegensatz zu Initialisierung mittels Konstruktor(-initialisierungsliste)?
-
camper schrieb:
Aggregatinitialisierungsliste
Hört sich schonmal gut an

Aber ist das hier auch wirklich Copy-Init ?Edit: Dann müsste ja der CopyCtor aufgerufen werden, den es ja aber bei einer Aggregat Klasse nicht geben darf.
-
KasF schrieb:
camper schrieb:
Aggregatinitialisierungsliste
Hört sich schonmal gut an

Aber ist das hier auch wirklich Copy-Init ?Der Standard sagt es wörtlich in 8.5./12
Das macht die Definition sehr einfach: Initialisierung mittels Aggregatinitialisierungsliste geschieht durch Copy-Initialisierung der einzelnen Member - damit ist automatisch geklärt, wie Subaggregate zu behandeln sind.KasF schrieb:
Edit: Dann müsste ja der CopyCtor aufgerufen werden, den es ja aber bei einer Aggregat Klasse nicht geben darf.
Jede Klasse besitzt eine CopyCtor, unabhängig davon, ob es ein Aggregat ist oder nicht. Dieser wird allerdings in diesem Fall nicht aufgerufen. Inhaltlich macht der - bei Aggregaten vom Compiler gelieferte - CopyCtor auch nichts anderes: er kopiert die einzelnen Member. Der einzige wesentliche Unterschied besteht darin, dass bei der Initialisierung mittels Aggregatinitialisierung bei einzelnen Member möglicherweise RVO eingesetzt werden kann, während das innerhalb des CopyCtors natürlich nicht möglich ist (der kann nur als Ganzes wegoptimiert werden).
-
Ok, danke dir.