Nicht verständliche Warnung vom Compiler
-
Hallo,
bei folgendem Code:
#include <windows.h> struct _player_ { int health = 100; int armor = 250; int strenght = 5; }; int main (int argc,char ** argv) { _player_ Erwin; cout << Erwin.health; cout << "\n"; cout << (Erwin.armor); cout << ("\n"); cout << (Erwin.strenght); system ("pause > NUL"); return 0; };bekomme ich folgende Warnungen vom Compiler:
[Warning] non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]
[Warning] non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]
[Warning] non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]Was soll das denn bedeuten? Wenn ich die Member des structs mit static ausstatte, dann bekomme ich folgende Fehler:
[Error] ISO C++ forbids in-class initialization of non-const static member '_player_::health'
[Error] ISO C++ forbids in-class initialization of non-const static member '_player_::armor'
[Error] ISO C++ forbids in-class initialization of non-const static member '_player_::strenght'Aber ich möchte ja keine Konstanten deklarieren bzw. definieren.
Kann ich die Warnung (s. o.) einfach ignorieren?Danke im Voraus!
MfG
Seikuassi
-
Du kannst so ohne weiteres in C++ nicht deinen Membervariablen einen Startwert mitgeben(wie z.B. in Java). Das ist erst im neuen Standard möglich, und genau das rät dir der Compiler auch.
-
Hallo Skym0sh0,
Du kannst so ohne weiteres in C++ nicht deinen Membervariablen einen Startwert mitgeben [...]
Aber warum denn nicht? Denn jede Variable, die vom Datentyp _player_ kommt, besitzt doch diesen Startwert. Es gibt ja so eine (oder vllt. mehrere) Möglichkeit mit Vererbungen oder ähnlich, mit dem ich einen Startwert ohne Warnung initialisieren kann, oder?
Was wäre denn jetzt die kürzeste Initialisierungsmöglichkeit, die man anwenden könnte?Oder anders gefragt: Was für Gefahren bergen sich hinter meiner Initialisierung?
Danke im Voraus!
MfG
Seikuassi
-
Es gibt keine Gefahren. Benutze es einfach, soweit du mit dem Feature vertraut bist. Du musst nur deinem GCC das entsprechende Flag mitgeben, damit er standardkonform arbeitet: -std=c++11 oder -std=gnu++11 (für Erweiterungen).
Denn jede Variable, die vom Datentyp _player_ kommt, besitzt doch diesen Startwert.
Ja, das ist richtig. __player__ ist kein Aggregat und hat auch keine entsprechenden Konstruktoren.
-
Hallo nochmal,
Es gibt keine Gefahren. Benutze es einfach, soweit du mit dem Feature vertraut bist.
Okay, danke! Sollte es Probleme geben, werde ich erst nach den structs gucken, wobei ich denke, dass das unnötig sein wird. Denn auch wenn es vllt. jemand stört oder als "Misshandlung" versteht, ich benutze structs meistens nur als Variablencontainer bzw. Datencontainer. Für Funktionen benutze ich namespaces und Klassen (die ja eigentlich structs entsprechen (außer mit der public-private-Geschichte)) eher selten.
Also danke nochmal!
MfG
Seikuassi
-
Obligatorischer Hinweis: _player_ ist im globalen Namensraum ein reservierter Bezeichner, den du nicht verwenden darfst (sondern nur der Compiler/die Standardbibliothek).
Allgemeine Regeln: Für die Implementation (Compiler/Standardbibliothek) reserviert sind
1. Bezeichner, die mit einem Unterstrich gefolgt von einem Großbuchstaben beginnen (etwa Foo)
2. Bezeichner, die zwei Unterstriche in Folge enthalten (etwa __foo, foo__bar)
3. im globalen Namensraum alle Bezeichner, die mit einem Unterstrich beginnen (etwa _foo, _player).
-
Seikuassi schrieb:
Du kannst so ohne weiteres in C++ nicht deinen Membervariablen einen Startwert mitgeben [...]
Aber warum denn nicht?
Warum das nicht geht leigt daran, dass es früher nicht möglich war.
Und warum es früher nicht ging, weiss ich nicht (ich tippe auf die Verletzung der ODR, aber kA, das liegt vor meiner Zeit).Ich finde es auf die Art, wie du es machst, auch viel besser und einfacher. Aber es ist halt noch sehr neu und wird nicht überall unterstützt.
Der "alte" Weg ist der hier:
struct _player_ { int health = 100; int armor = 250; int strenght = 5; _player_() : health(100), armor(250), strenght(5) { } };
-
Es ging früher nicht, weil der alte Standard es nicht vorsieht.
Nicht alles was der alte Standard nicht vorsieht hat technische Gründe.
Und auch nicht alles was der neue Standard nicht vorsieht hat technische Gründe.
-
Ok, dann anders gefragt. Wieso war das nichtso? Wurde da keine Gründe genannt?
Oder umgekehrt: Was sind die Vor- und Nachteile?
-
Skym0sh0 schrieb:
Ok, dann anders gefragt.
Vermutlich weil niemand daran gedacht hat...
-
Compiler Options -> Other Options und einfach
-std=gnu++11
reinsetzten. (Code::Blocks + GCC)mfg
HarteWare
Edit: lol... ich werds ab jetzt wohl entgültig lassen.. P.S. ist keine Absicht!