Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

12.03.2013, 13:26

DevCpp { [Error] ISO C++ forbids in-class initialization of non-const static member 'testint'

Hiho,

ich wollte nach einer Pause mal wider etwas versuchen.

Nun habe ich aber schon am Anfang ein Problem :/

class Test{
private:

int testint = 1;


public:
};


Versuche ich nun zu Kompilen sagt er mir:


[Error] ISO C++ forbids initialization of member 'testint' [-fpermissive]
[Error] making 'testint' static [-fpermissive]
[Error] ISO C++ forbids in-class initialization of non-const static member 'testint'

Ich kapier nicht was ich da falsch mache?
Bitte Helft Mir!?[size=10] [/size];([size=10] [/size]
[size=10]
[/size]
[size=10]
[/size]
[size=10]Gruß[/size]

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

2

12.03.2013, 13:59

Die Fehlermeldung sagt es ja schon: Du darfst Klassenvariablen ("Member Vars") nicht direkt in der Klassendefinition initialisieren. Bedenke, dass eine Klasse nur ein "Bauplan" ist, nachdem man dann Instanzen, also Exemplare bauen kann. Der "Bauplan" gibt vor, was für Einträge die Klasse hat, und in den jeweiligen Exemplaren steht dann ein Wert für jeden der Einträge drin. Wenn Du einer Membervar in allen neuen Instanzen standardmäßig einen Wert geben willst, gibt es dafür den Konstruktor

Quellcode

1
2
3
4
5
6
class Test {
  int testVar;
  
  // Das hier ist der Standardkonstruktor
  Test() { testVar = 1; }
};
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

3

12.03.2013, 14:01

Du solltest versuchen die Fehlermeldung etwas mehr zu beachten.
Du darfst an der Stelle dein testint nicht Initialisieren. Sprich, der Variablen einen Wert zu weisen. Ich lass jetzt einfach mal die Technik wieso weg. Aber du solltest dir was C++ angeht eventuell noch einmal die Begriffe Deklaration, Definition und Initialisierung ansehen.

Um testint zu initialisieren solltest du die Initialisierungsliste des Konstruktors der Klasse verwenden, oder im Konstruktor selbst (Würde aber zur Liste raten).

C-/C++-Quelltext

1
2
3
4
5
6
class Test{ 
private: 
   int testint; // >> int testint = 1;<< Verboten, der Compiler will >>static const testint1 = 1;<< aber ich denke mal du nicht.
public:
   Test( ) : testint( 1 ) { }; // Initialisierungsliste nach dem : 
};


Understanding Initialization Lists in C++

Edit:
Mist 2 Minuten zu langsam ;)
:love: := Go;

4

12.03.2013, 14:33

In C++11 kannst du auch nichtstatische Member direkt in der Klasse initialisieren. Das funktioniert dann genauso, wie du es in deiner Testklasse schon gemacht hast.

Das wird aber erst von wenigen Compilern unterstützt, z.B. von MinGW bzw. GCC 4.7. In VS 2012 funktioniert es hingegen nicht, wenn ich mich nicht irre.

5

12.03.2013, 14:39

Danke für die schnellen Antworten!!

Beschreibt ihr vor den Initialisierungen >>Test() eine Funktion oder die Klasse selbst??

Und mal beiläufig eine Frage:
Kann man die Darstellung von DevCpp verändern? Sprich: Hintergrund und die Schrift?
Nicht in der Console beim ausführen sonder das Fenster in dem man es schreibt.


Gruß

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

6

12.03.2013, 15:33

So ganz habe ich jetzt deine Frage nicht verstanden, falls du die Initialisierungsliste meinst, die ruft die Konstruktoren der Member auf.
Würde man die Initialisierungsliste nicht verwenden würde bei der Konstruktion des Objekts zuerst der Standard Konstruktor der Member aufgerufen (Welchen nicht alle Klassen besitzen).

Oder meinst du die Methode Test()? Eine Methode mit dem Namen der Klasse hat eine besondere Bedeutung und nennt sich Konstruktor davon kann es mehrere geben (mit Parmeterliste), es gibt auch noch den Destruktor ~Test() (Nur den einen). Mit dem Konstruktor beginnt quasi das Leben eines Objekts und mit dem Destruktor endet es.

Ich denke du solltest dir einmal ein gutes C++ Tutorial oder ein Buch (Wie wohl die meisten hier im Forum kann ich dir da den C++ Programmierer empfehlen.) durcharbeiten, dann werden dir sicher die Dinge sehr schnell klar und es ist deutlich besser beschrieben als man es in einem Post könnte.
:love: := Go;

Werbeanzeige