Initalisierung eines boolean Arrays in der Klasse funktioniert nicht

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Initalisierung eines boolean Arrays in der Klasse funktioniert nicht

    Moinmoin,
    ich habe mich jetzt endlich an OOP in C++ in verbindung mit SDL rangetraut. Mein Problem ist, dass ich gerne einen boolischen (heißt das so ?( ) im private-Bereich initalisieren würde. Doch wenn ich das versuche bekomm ich folgende Fehlermeldung:

    ...\SGSF\include\GameFunctions.h|14|error: a brace-enclosed initializer is not allowed here before '{' token|
    ...\SGSF\include\GameFunctions.h|14|error: ISO C++ forbids initialization of member 'keys'|
    ...\SGSF\include\GameFunctions.h|14|error: making 'keys' static|
    ...\SGSF\include\GameFunctions.h|14|error: invalid in-class initialization of static data member of non-integral type 'bool [323]'|
    ...\SGSF\include\GameFunctions.h||In member function 'void game::handleInput()':|
    ...\SGSF\include\GameFunctions.h|79|error: 'keys' was not declared in this scope|
    ...\SGSF\include\GameFunctions.h|84|error: 'keys' was not declared in this scope|
    ...\SGSF\include\GameFunctions.h|88|error: 'keys' was not declared in this scope|
    ...\SGSF\main.cpp||In function 'int SDL_main(int, char**)':|
    ...\SGSF\main.cpp|13|warning: no return statement in function returning non-void|
    ||=== Build finished: 7 errors, 1 warnings ===|


    Code:

    Quellcode

    1. #include <string>
    2. #include <iostream>
    3. #include <cstdlib>
    4. #include "integer.h"
    5. using namespace std;
    6. class game
    7. {
    8. private:
    9. bool gameRunning;
    10. bool keys[323] = {false};
    11. SDL_Event event;
    12. public:
    13. game();
    14. void start();
    15. bool isRunning();
    16. void drawSprite(int sWidth, int sHeight, int xPos, int yPos, SDL_Surface* source, SDL_Surface* destination);
    17. void handleInput();
    18. void close();
    19. };
    Alles anzeigen


    Wenn ich den Array in der handle::input(); initalisiere läuft alles ohne Probleme. Wäre dankbar für Hilfe ^^
  • hi,

    es ist ratsam das array in der cpp file zu initialisieren. Ich glaube auch man kann die nicht im header initialisieren,
    Versuche es mal entweder direkt im Konstruktor oder in einer extra Methode zu initialisieren.

    Ach ja um auf private attribute zu zugreifen brauchst du noch für jedes attribut eine get/set-methode

    Quellcode

    1. // header
    2. private: bool keys[323];public: bool get_keys();public: void set_keys(bool key);
    3. //--------------------------------//
    4. //cpp
    5. bool get_keys(){return keys;}
    6. void set_keys(bool key){ keys = key;}



    grüße
    nobody

    edit: kann mich mal jemand aufklären wieso der teil zwischen dem codetags so komisch formatiert und wie ich das behebe?^^
    "Irren ist menschlich. Aber wer richtigen Mist bauen will, braucht einen Computer."

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von nobody special ()

  • Das Array befinden sich doch nur in deiner Klasse :)

    Du kannst dir die Header Datei als eine Art Bauplan für ein Objekt vorstellen
    Die das zugehörige CPP File definiert den Inhalt der Methoden

    Um in deinem Programm dann dein Array nutzen zu können benötigst du eine Instanz davon.
    Objektorientierte Programmierung bieten den Vorteil das wir mit Objekten arbeiten können.
    Das heiß wir erstellen ein Objekt mit Eigenschaften(Attribute) und Fähigkeiten(Methoden)
    diese besteht aus Header und CPP.
    Nun können wir so viele Instanzen wie wir brauchen von dem Objekt erstellen. Jede Instanz beinhalten dann die Attribute und Methoden und sind trotzdem von ihrem werten unterschiedlich


    Eine Instanz erzeugst du mit dem Befehl new.
    Es ist aber darauf zu achten das man diese Instanz von einem Objekt, wenn man sie nicht mehr benötigt mir delete wieder löscht.
    Da der Befehl new für dein Objekt, vom Heap speicher anfordert und ihn erst wieder mit delete freigibt.
    "Irren ist menschlich. Aber wer richtigen Mist bauen will, braucht einen Computer."
  • Das Array befinden sich doch nur in deiner Klasse :)

    Du kannst dir die Header Datei als eine Art Bauplan für ein Objekt vorstellen
    Die das zugehörige CPP File definiert den Inhalt der Methoden

    Um in deinem Programm dann dein Array nutzen zu können benötigst du eine Instanz davon.
    Objektorientierte Programmierung bieten den Vorteil das wir mit Objekten arbeiten können.
    Das heiß wir erstellen ein Objekt mit Eigenschaften(Attribute) und Fähigkeiten(Methoden)
    diese besteht aus Header und CPP.
    Nun können wir so viele Instanzen wie wir brauchen von dem Objekt erstellen. Jede Instanz beinhalten dann die Attribute und Methoden und sind trotzdem von ihrem werten unterschiedlich


    Eine Instanz erzeugst du mit dem Befehl new.
    Es ist aber darauf zu achten das man diese Instanz von einem Objekt, wenn man sie nicht mehr benötigt mir delete wieder löscht.
    Da der Befehl new für dein Objekt, vom Heap speicher anfordert und ihn erst wieder mit delete freigibt.

    Edit: oh, hat er glatt zweimal gepostet, naja doppelt hält besser :)
    "Irren ist menschlich. Aber wer richtigen Mist bauen will, braucht einen Computer."
  • Hi Jaffa Coder,

    folgendes

    Quellcode

    1. bool keys[323] = {false};

    kannst du so nicht machen; das ist ein Syntaxfehler.

    Was willst du damit ausdrücken ? Dass das ganze Array mit false initialisiert wird ?
    Wie kommst du denn darauf das so hinzuschreiben ? Gibt es eine Sprache die diese Nuance bietet ?

    Typischerweise nutzt man den Konstruktor dazu, solche Dinge zu erledigen.

    BTW: was meint ihr mit SDL, was ist das ?
    BTW': wie kann ich dem Syntaxhighlight eine Sprache sagen ?
  • SDL = Simple DirectMedia Layer
    Klick mal unten auf 'Syntax'. Dann siehst du die ganzen Sprachen. Klicke auf C&C++ und fertig.
    Für die Initialisierung von eines solchen boolean-Arrays würde ich das Ganze so machen, wahrscheinlich geht´s leichter und vor Allem schneller:

    Quellcode

    1. bool Keys[323];
    2. for(int i=0; i<323; ++i)
    3. keys[i] = false;

    Doch merk dir: Keine Initialisierungen in dem Klassenkopf! Nur im Körper, sozusagen. Einfach nicht zwischen der Deklaration der Klasse, ich hoffe du weißt was gemeint ist....


    MfG
    Check

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Checkmateing ()

  • Grundsätzlich kann man keine Variablen direkt in der Headerstruktur mit einem Wert festlegen. Da du eine Klasse hast und man bei Klassen davon ausgeht das diese sich von anderen zumindest Teilweße unterscheiden muss die einzelnen Variablen initializerung der Klasse im Konstruktor erfolgen, es könnte ja sein das sich die Klasse unterschiedlich verhaltet....

    zb. mit memset(keys, sizeof(keys), 0)
    oder ner eigenen Schleife

    @Runnable:
    SDL -> Grafik-Engine

    @nobody special:
    Im Beitragseditor unterhalb des Editorfensters Syntax auswählen ;)

    Mfg Rushh0ur
  • Falsch! Die SDL ist nicht nur eine Grafikengine. ;)
    Was sie kann steht hier, auch wenn ich diese Seite nicht mag. <.<
    Und freilich steht dort mitunter
    Audioausgabe
    In 8 und 16 bit, mono/stereo
    , was mehr als Grafikausgabe ist.
    Statt SDL würde ich eher SFML benutzen. Warum? Darum!

    MfG
    Check

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Checkmateing ()